實驗4 數據庫的安全性、完整性


實驗4數據庫的安全性、完整性

實驗目的要求

  1. 掌握自主存取控制權限的定義和維護方法;

  2. 掌握實體完整性的定義和維護方法;

  3. 掌握參照完整性的定義和維護方法;

  4. 掌握用戶自定義完整性的定義和維護方法。

實驗主要內容

  1. 定義用戶、角色,分配權限給用戶、角色,回收權限,以相應的用戶名登錄數據庫驗證權限分配是否正確。選擇一個應用場景,使用自主存取控制機制設計權限分配。可以采用兩種方案。方案一:采用sa超級用戶登錄數據庫,完成所有權限分配工作,然后用相應用戶名登陸數據庫以驗證權限分配正確性;方案二:采用sa用戶登陸數據庫創建三個部門經理用戶,並分配相應的權限,然后分別用三個經理用戶名登陸數據庫,創建相應部門的USER, ROLE,並分配相應權限。驗證權限分配之前,請備份好數據庫;針對不同用戶所具有的權限,分別設計相應的SQL語句加以驗證。

  2. 定義實體完整性,刪除實體完整性。能夠寫出兩種方式定義實體完整性的SQL語句:創建表時定義實體完整性、創建表后定義實體完整性。設計SQL語句驗證完整性約束是否起作用。

  3. 定義參照完整性,定義參照完整性的違約處理,刪除參照完整性。寫出兩種方式定義參照完整性的SQL語句:創建表時定義參照完整性、創建表后定義參照完整性。

  4. 針對具體應用語義,選擇NULL/NOT NULL、DEFAULT,UNIQUE、CHECK等,定義屬性上的約束條件。

實驗儀器設備

  1. 學生每個一台PC機

  2. 已安裝SQL Server環境

實驗記錄

安全性

創建和刪除用戶

  1. 使用sa超級用戶登錄數據庫

  2. 打開【新建查詢】,輸入

    CREATE USER U1 WITHOUT LOGIN 
    EXECUTE AS USER = 'U5'
    REVERT
    

    創建多個不用登錄的用戶

  3. 查看當前用戶授權情況的語句為

    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+樹)

--創建表
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約束正常工作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM