2024年5月24日第五十五篇

石铁生發表於2024-05-24

今天學習了sql server資料庫中安全管理有關的操作。

成功建立 students 資料庫。

在 SQL Server 管理器中,建立一個新的 windows 登入名。

(1) 新建了一個名為MSI的登入名。

在 SQL Server 管理器中為自己建立一個 SQL SERVER 伺服器登入名(自己學號)。

(2) 新建了一個名為20224125的sql server的伺服器登入名。

為所屬的 SQL 伺服器設定混合認證安全認證模式。

(3) 設定了安全認證模式

用自己建立的登入名登入伺服器。

(4) 用自己的登入名登陸了伺服器。

(5) 中為自己建立一個 students 資料庫使用者(20224125-user)和 角色(20224125-role)。

(6) 用管理器實現如下許可權的分配:

① 將 student 表中“sname”、“ssex”、“sage”的修改許可權賦予自己建立的資料庫用 戶。

GRANT UPDATE (sname, ssex, sage) ON dbo.student TO [20224125-user];

② 將 student 表、course 表、sc 表的查詢許可權授予自己建立的角色。

GRANT SELECT ON dbo.student TO [20224125-role];

GRANT SELECT ON dbo.course TO [20224125-role];

GRANT SELECT ON dbo.sc TO [20224125-role];

③ 拒絕自己建立的角色擁有 sc 表中 grade 的修改許可權。

DENY UPDATE (grade) ON dbo.sc TO [20224125-role];

④ 將自己建立的資料庫使用者新增為自己建立的角色成員。

ALTER ROLE [20224125-role] ADD MEMBER [20224125-user];

(7) 用管理器建立觸發器實現如下安全性和完整性:

①定義 course 表中 credit 屬性為“3”的預設。

ALTER TABLE dbo.course ADD CONSTRAINT DF_CourseCredit DEFAULT 3 FOR credit;

②建立 course 與 sc 表間來維護參照完整性而使用的一個級聯刪除觸發器、一個級 聯修改觸發器和一個受限插入觸發器。

級聯刪除觸發器

CREATE TRIGGER trg_CascadeDelete

ON dbo.course

AFTER DELETE

AS

BEGIN

DELETE FROM dbo.sc WHERE cno IN (SELECT cno FROM deleted);

END;

級聯修改觸發器

CREATE TRIGGER trg_CascadeUpdate

ON dbo.course

AFTER UPDATE

AS

BEGIN

UPDATE s

SET s.cno = i.cno

FROM dbo.sc s

INNER JOIN inserted i ON s.cno = i.cno;

END;

受限插入觸發器

(8) CREATE TRIGGER trg_RestrictedInsert

(9) ON dbo.sc

(10) INSTEAD OF INSERT

(11) AS

(12) BEGIN

(13) -- 檢查插入的資料是否符合要求

(14) IF EXISTS (SELECT 1 FROM inserted WHERE grade < 0 OR grade > 100)

(15) BEGIN

(16) -- 如果插入的資料不符合要求,則丟擲錯誤資訊並終止插入操作

(17) RAISERROR ('Invalid grade. Grade must be between 0 and 100.', 16, 1);

(18) ROLLBACK TRANSACTION; -- 可選,如果需要回滾插入操作

(19) RETURN; -- 可選,如果需要終止觸發器的執行

(20) END

(21)

(22) -- 如果插入的資料符合要求,則執行插入操作

(23) INSERT INTO dbo.sc ( cno, grade)

(24) SELECT cno, grade

(25) FROM inserted;

(26) END;

(27) 對“students 資料庫”編寫儲存過程,完成下面功能: ① 統計成績 60 分以下的人數;

(28) CREATE PROCEDURE sp_CountBelow60

(29) AS

(30) BEGIN

(31) SELECT COUNT(*) AS Below60Count

(32) FROM dbo.sc

(33) WHERE grade < 60;

(34) END;

② 統計給定 cno 的課程的平均成績,並返回平均成績;

CREATE PROCEDURE sp_AvgGradeByCourse

@cno INT

AS

BEGIN

SELECT AVG(grade) AS AvgGrade

FROM dbo.sc

WHERE cno = @cno;

END;

③將 sc 表中 grade 從百分制改為等級制(5、4、3、2、1)。即 0-20 分為 1,21-40 為 2,4 1-60 為 3,61-80 為 4,81-100 為 5。

CREATE PROCEDURE sp_ConvertGrades

AS

BEGIN

UPDATE dbo.sc

SET grade =

CASE

WHEN grade BETWEEN 0 AND 20 THEN 1

WHEN grade BETWEEN 21 AND 40 THEN 2

WHEN grade BETWEEN 41 AND 60 THEN 3

WHEN grade BETWEEN 61 AND 80 THEN 4

WHEN grade BETWEEN 81 AND 100 THEN 5

ELSE NULL

END;

END;

(9) 完成課本 P172 頁的上機練習。

相關文章