--創(chuàng)建角色 role_test
EXEC sp_addrole 'role_test'
--添加登錄 login_test,設(shè)置密碼為Test123,默認(rèn)數(shù)據(jù)庫為測試庫
EXEC sp_addlogin 'login_test','Test123','測試庫'
--為登錄 login_test 在數(shù)據(jù)庫 pubs 中添加安全賬戶 user_test
EXEC sp_grantdbaccess 'login_test','user_test'
--添加 user_test 為角色 role_test 的成員
EXEC sp_addrolemember 'role_test','user_test'
--授予角色 role_test 對 [dbo].[Table_test2] 表的 SELECT 權(quán)限
GRANT SELECT ON [dbo].[Table_test] TO role_test
下面是擴(kuò)展示例:
GO
/*--示例說明
示例在數(shù)據(jù)庫中創(chuàng)建一個(gè)擁有表[dbo].[Table_test]的所有權(quán)限、擁有表[dbo].[Table_test2]的SELECT權(quán)限的角色role_test
隨后創(chuàng)建了一個(gè)登錄login_test,然后在數(shù)據(jù)庫測試庫中為登錄login_test創(chuàng)建了用戶賬戶user_test
同時(shí)將用戶賬戶user_test添加到角色role_test中,使其通過權(quán)限繼承獲取了與角色role_test一樣的權(quán)限
最后使用DENY語句拒絕了用戶賬戶user_test對表[dbo].[Table_test]的SELECT權(quán)限。
經(jīng)過這樣的處理,使用login_test登錄SQL Server實(shí)例后,它只具有表[dbo].[Table_test2]的select權(quán)限和對表[dbo].[Table_test]出select外的所有權(quán)限。
--*/
GO
/*--
USE [測試庫]
--創(chuàng)建角色 role_test
EXEC sp_addrole 'role_test'
--添加登錄 login_test,設(shè)置密碼為Test123,默認(rèn)數(shù)據(jù)庫為測試庫
EXEC sp_addlogin 'login_test','Test123','測試庫'
--為登錄 login_test 在數(shù)據(jù)庫 pubs 中添加安全賬戶 user_test
EXEC sp_grantdbaccess 'login_test','user_test'
--添加 user_test 為角色 role_test 的成員
EXEC sp_addrolemember 'role_test','user_test'
--用login_test登陸,發(fā)現(xiàn)在SSMS中找不到仍和表,因此執(zhí)行下述兩條語句出錯(cuò)。
select * from [dbo].[Table_test2]
select * from [dbo].[Table_test]
--授予角色 role_test 對 [dbo].[Table_test] 表的所有權(quán)限
GRANT ALL ON [dbo].[Table_test] TO role_test
--The ALL permission is deprecated and maintained only for compatibility.
--It DOES NOT imply ALL permissions defined on the entity.
--ALL 權(quán)限已不再推薦使用,并且只保留用于兼容性目的。它并不表示對實(shí)體定義了 ALL 權(quán)限。
--測試可以查詢表[dbo].[Table_test],但是別的表無法查詢
select * from [dbo].[Table_test]
--如果要收回權(quán)限,可以使用如下語句。(可選擇執(zhí)行)
revoke all on [dbo].[Table_test] from role_test
--ALL 權(quán)限已不再推薦使用,并且只保留用于兼容性目的。它并不表示對實(shí)體定義了 ALL 權(quán)限。
--授予角色 role_test 對 [dbo].[Table_test2] 表的 SELECT 權(quán)限
GRANT SELECT ON [dbo].[Table_test2] TO role_test
--用login_test登陸,發(fā)現(xiàn)可以查詢[dbo].[Table_test2]和[dbo].[Table_test]兩張表
select * from [dbo].[Table_test2]
select * from [dbo].[Table_test]
--拒絕安全賬戶 user_test 對 [dbo].[Table_test] 表的 SELECT 權(quán)限
DENY SELECT ON [dbo].[Table_test] TO user_test
--再次執(zhí)行查詢[dbo].[Table_test]表的語句,提示:拒絕了對對象 'Table_test' (數(shù)據(jù)庫 '測試庫',架構(gòu) 'dbo')的 SELECT 權(quán)限。
select * from [dbo].[Table_test]
--重新授權(quán)
GRANT SELECT ON [dbo].[Table_test] TO user_test
--再次查詢,可以查詢出結(jié)果。
select * from [dbo].[Table_test]
USE 測試庫
--從數(shù)據(jù)庫中刪除安全賬戶,failed
EXEC sp_revokedbaccess 'user_test'
--刪除角色 role_test,failed
EXEC sp_droprole 'role_test'
--刪除登錄 login_test,success
EXEC sp_droplogin 'login_test'
--*/