實驗4數據庫的安全性、完整性
實驗目的要求
-
掌握自主存取控制權限的定義和維護方法;
-
掌握實體完整性的定義和維護方法;
-
掌握參照完整性的定義和維護方法;
-
掌握用戶自定義完整性的定義和維護方法。
實驗主要內容
-
定義用戶、角色,分配權限給用戶、角色,回收權限,以相應的用戶名登錄數據庫驗證權限分配是否正確。選擇一個應用場景,使用自主存取控制機制設計權限分配。可以采用兩種方案。方案一:采用sa超級用戶登錄數據庫,完成所有權限分配工作,然后用相應用戶名登陸數據庫以驗證權限分配正確性;方案二:采用sa用戶登陸數據庫創建三個部門經理用戶,並分配相應的權限,然后分別用三個經理用戶名登陸數據庫,創建相應部門的USER, ROLE,並分配相應權限。驗證權限分配之前,請備份好數據庫;針對不同用戶所具有的權限,分別設計相應的SQL語句加以驗證。
-
定義實體完整性,刪除實體完整性。能夠寫出兩種方式定義實體完整性的SQL語句:創建表時定義實體完整性、創建表后定義實體完整性。設計SQL語句驗證完整性約束是否起作用。
-
定義參照完整性,定義參照完整性的違約處理,刪除參照完整性。寫出兩種方式定義參照完整性的SQL語句:創建表時定義參照完整性、創建表后定義參照完整性。
-
針對具體應用語義,選擇NULL/NOT NULL、DEFAULT,UNIQUE、CHECK等,定義屬性上的約束條件。
實驗儀器設備
-
學生每個一台PC機
-
已安裝SQL Server環境
實驗記錄
安全性
創建和刪除用戶
-
使用sa超級用戶登錄數據庫
-
打開【新建查詢】,輸入
CREATE USER U1 WITHOUT LOGIN EXECUTE AS USER = 'U5' REVERT
創建多個不用登錄的用戶
-
查看當前用戶授權情況的語句為
SELECT pr.principal_id, pr.name, pr.type_desc, pr.authentication_type_desc, pe.state_desc, pe.permission_name, s.name + '.' + o.name AS ObjectName FROM sys.database_principals AS pr JOIN sys.database_permissions AS pe ON pe.grantee_principal_id = pr.principal_id JOIN sys.objects AS o ON pe.major_id = o.object_id JOIN sys.schemas AS s ON o.schema_id = s.schema_id;
4.定義多個用戶
CREATE USER U1 WITHOUT LOGIN ;
CREATE USER U2 WITHOUT LOGIN ;
CREATE USER U3 WITHOUT LOGIN ;
CREATE USER U4 WITHOUT LOGIN ;
CREATE USER U5 WITHOUT LOGIN ;
5.刪除用戶
--聲明數據庫引用
use database_name;
go
--判斷是否存在用戶自定義用戶,如果存在則刪除。
if exists(select * from sys.database_principals where name=user_name)
--把架構所有者修改回來架構自身
alter authorization on schema::[Architecture_name] to Architecture_name;
--刪除角色擁有的成員
alter role [[Architecture_name] drop member user_name;
--刪除擴展屬性
exec sys.sp_dropextendedproperty @name=N'tests_description', @level0type=N'user',@level0name=N'user_name'
--刪除用戶架構
drop user user_name;
go
--database_name
--數據庫名稱
--user_name
--用戶名稱
--Architecture_name
--架構名稱
--tests_description
--擴展屬性名稱
執行完命令之后,點擊刷新便能夠看到用戶被刪除。
給用戶授權
授權、查,增,改的方法
use 學生
go
--分配權限
grant select,insert,Update on Students to U1
grant create table to U1
把對 Student表和 Course表的全部操作權限授予用戶U2和U3。
SQL server的授權同時只能操作一個數據庫對象(Object)
GRANT ALL PRIVILEGES ON OBJECT::S_T.Student TO U2,U3
GRANT ALL PRIVILEGES ON OBJECT::S_T.Course TO U2,U3
把對表SC的查詢權限授予所有用戶
GRANT SELECT ON SC TO PUBLIC
把查詢Student表和修改學生學號權限授給用戶U4
GRANT UPDATE(SNO),SELECT
ON Student
TO U4
驗證有效性
BEGIN TRANSACTION;
EXECUTE AS USER='U4';
UPDATE student
SET SNO='1234'
WHERE SNO='201215125';
REVERT;
SELECT * FROM student;
ROLLBACK;
把對表SC的 INSERT權限授予U5用戶,並允許將此權限再授予其他用戶。
GRANT INSERT
ON SC
TO U5
WITH GRANT OPTION
驗證有效性
EXECUTE AS USER='U5';
INSERT INTO SC(SNO,CNO,GRADE) VALUES (201215125,4,98);
REVERT;
SELECT * FROM SC;
U5將INSERT的權限傳播給U6,U6也可將INSERT的權力授予U7
EXECUTE AS USER ='U5'
GRANT INSERT
ON SC
TO U6
WITH GRANT OPTION
REVERT
EXECUTE AS USER ='U6'
GRANT INSERT
ON SC
TO U7
WITH GRANT OPTION
REVERT
權限回收
--把用戶U4修改學生學號的權限收回
REVOKE UPDATE(SNO)
ON student
FROM U4
--收回所有用戶對表SC的查詢權限
REVOKE SELECT
ON SC
FROM PUBLIC
--把用戶U5,U6,U7對SC表的INSERT權限收回
--使用CASCADE
REVOKE INSERT
ON SC
FROM U5 CASCADE
驗證權限是否收回成功
EXECUTE AS USER='U4';
UPDATE student
SET SNO='1234'
WHERE SNO='201215125';
REVERT;
EXECUTE AS USER='U1';
SELECT * FROM SC
REVERT;
EXECUTE AS USER='U5';
INSERT INTO SC(SNO,CNO,GRADE) VALUES (201215125,4,98);
REVERT;
定義實體完整性,刪除實體完整性
-
實體完整性
- 實體完整性定義
- CREAT TABLE中用PRIMARY KEY定義
- 單屬性構成的碼有兩種說明方法(PRIMARY KEY的位置和語法不同):
- 定義為列級約束條件
- 定義為表記約束條件
- 對多個屬性構成的碼只有一種說明方法
- 定義為表級約束條件 (PRIMARY KEY(Sno,Cno))
- 實體完整性檢查和違約處理
- 插入和更新時DBMS按照實體完整性規則進行自動檢查
- 由於全表掃描效率太低,便使用索引(B+樹)
- 插入和更新時DBMS按照實體完整性規則進行自動檢查
- 實體完整性定義
--創建表
CREAT TABLE COURSE(
CNO CHAR(4) NOT NULL
PRIMARY KEY,
CNAME NCHAR(50),
CPNO CHAR(4),
ccredit smallint
)
--添加實體完整性
ALTER TABLE COURSE
ADD CONSTRAINT COURSE_PK
PRIMARY KEY(Cno);
--刪除實體完整性
ALTER TABLE Course DROP CONSTRAINT PK__Course__C1fe6373BC8AAD0E
定義參照完整性,參照完整性違約處理,刪除參照完整性
-
參照完整性
-
參照完整性定義
-
一個關系的外碼或者取空值或者等於它所參照的關系的主碼值
-
在CREAT TABLE中用FOREIGN KEY短語定義哪些列為外碼
-
用REFERENCES短語指明這些外碼參照哪些表的主碼
-
表級定義、列級定義參照完整性,具體代碼實例看資料
-
-
在參照完整性檢查和違約處理
-
對參照表和被參照表進行增刪改操作時進行完整性檢查和違約處理
-
被參照表 參照表 違約處理 插入元組 拒絕 修改外碼值 拒絕 刪除元組 拒絕/級聯刪除/設置為空值 修改主碼值 拒絕/級聯修改/設置為空值 -
拒絕執行(NO ACTION)
-
級聯操作(CASCADE)
-
設置空值(SET-NULL)
-
示例代碼 CREAT TABLE SC (Sno CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT, PRIMARY KEY(Sno,Cno), FOEREIGN KEY(Sno)REFERENCES Student(Sno) ON DELETE CASCADE /*級聯刪除SC表中的相應的元組*/ ON UPDATE CACADE, /*級聯更新相應的元組*/ FOREIGN KEY (Cno)REFERENCES Course(Cno) ON DELETE NO ACTION/*當刪除course表中的元組造成了與SC表不一致時拒絕刪除*/ ON UPDATE CASCADE /*當更新coourse表中的Cno時,級聯更新SC表中相應的元組*/ );
-
-
-
用戶定義完整性
-
針對某一具體應用的數據必須滿足的語義要求
-
CREAT TABLE 時定義屬性上的約束條件
-
列值非空(NOT NULL)
-
列值唯一(UNIQUE)
-
檢查列值是否滿足一個條件表達式(CHECK)
CREAT TABLE DEPT ( Deptno NUMERIC(2), Dname CHAR(9) UNIQUE NOT NULL, /*要求Dname列值唯一,並且不能取空值*/ PRIMARY KEY(Deptno) );
CHECK (條件)
-
-
屬性上的約束條件檢查和違約處理(只涉及單個屬性)
-
元組上的約束條件定義(涉及多個屬性)
CHECK
位置不同
實體完整性 參照完整性 用戶定義完整性 定義方法 CREAT TABLE CREAT TABLE CREAT TABLE 檢查時機 執行插入、修改操作 參照表、插入/修改被參照表:刪除/修改 執行插入、修改操作 違約處理 拒絕執行 拒絕執行/級聯操作/設置為空值 拒絕執行 -
-
完整性約束名子句
CONSTRAINT
語句的用法,詳見課本資料
CHECK約束
通過限制一個或多個列可接受的值,CHECK 約束可以強制域完整性。 可以通過任何基於邏輯運算符返回 TRUE 或 FALSE 的邏輯(布爾)表達式創建 CHECK 約束。
用成績來舉例,成績都有最大和最小值,為了避免出現負分,超分,應該給成績列添加上CHECK約束
ALTER TABLE SC
ADD CONSTRAINT Check_for_grade
CHECK(0<= Grade AND Grade <=100)
驗證約束是否生效
INSERT INTO SC(SNO,CNO,Grade) VALUES(201215125,6,120)
CHECK約束正常工作。