SQL Server數據庫級權限

前面博文《SQL Server服務器級權限》介紹了服務器級安全主題的權限,本文將繼其之後,來介紹一下數據庫級安全主題具有的權限,以及如何賦予、拒絕數據庫用戶、角色權限,並介紹查看用戶、角色具有哪些權限的方法。

本文同樣使用 sys.fn_builtin_permissions 來查看安全主題數據庫具有的權限

SELECT * FROM sys.fn_builtin_permissions('database')

SQL Server 2008擁有的數據庫權限:

  1. CREATE TABLE:授予或拒絕創建表的權限。此權限隱式授予db_ddladmin和db_owner固定數據庫角色。在SQL Server 2005或更高兼容性模式中,用戶仍然需要ALTER SCHEMA 權限才能在特定架構中創建表。

  2. CREATE VIEW:賦予或拒絕創建視圖的權限。在SQL Server 2005或更高兼容性模式中,用戶仍然需要ALTER SCHEMA 權限才能在特定架構中創建視圖。

  3. CREATE PROCEDURE:賦予或拒絕創建存儲過程的權限。數據庫固定角色db_ddladmin和db_owner隱含此權限。在SQL Server 2005或更高版本,用戶還需要ALTER SCHEMA權限才能在特定對應架構下創建它。

  4. CREATE FUNCTION:賦予或拒絕創建函數的權限。數據庫固定角色db_ddladmin和db_owner隱含此權限。在數據庫2005或更高版本中,用戶還需要ALTER SCHEMA權限才能在特定架構下創建它。

  5. CREATE RULE:賦予或拒絕創建規則的權限。數據庫固定角色db_ddladmin和db_owner隱含這個權限。在SQL Server 2005 或者更高版本中,用戶還需要ALTER SCHEMA 權限才能在這個架構下創建它。

  6. CREATE DEFAULT:賦予或拒絕創建默認值的權限。這數據庫固定角色db_ddladmin和db_owner隱含權限。在SQL Server 2005或更高兼容版本中,用戶還需要ALTER SCHEMA 權限在特定架構中創建它。

  7. BACKUP DATABASE:賦予或者拒絕備份數據庫的權限,db_backupoperator固定數據庫角色有此權限

  8. BACKUP LOG:賦予或者拒絕備份數據庫日誌的權限,db_backupoperator固定數據庫角色有此權限

  9. CREATE DATABASE:賦予或拒絕master數據庫下的用戶CREATE或DROP數據庫的權限

  10. CREATE TYPE:賦予或者拒絕創建類型的權限。數據庫固定角色db_ddladmin和db_owner隱含此權限。在SQL Server 2005或者更高版本中,用戶還需要ALTER SCHEMA 權限才能在對應架構中創建它。

  11. CREATE ASSEMBLY:賦予或拒絕某數據庫中CREATE或DROP一個程序集的權限。如果程序集權限需要EXTERNAL_ACCESS,登陸賬戶必須同時擁有EXTERNAL ACCESS ASSEMBLY權限。如果權限設置爲UNSAFE,登陸賬戶必須爲sysadmin固定服務器角色。和ALTER ANY ASSEMBLY 不同,用戶必須擁有該程序集,或者有對程序集有CONTROL權限,才能刪除它。

  12. CREATE XML SCHEMA COLLECTION:賦予或拒絕創建XML架構集合的權限。數據庫固定角色db_ddladmin和db_owner隱含此權限。在數據庫2005或更高版本中,用戶還需要ALTER SCHEMA權限才能在特定架構下創建它。

  13. CREATE SCHEMA:賦予或拒絕在數據庫中創建架構的權限。和ALTER ANY SCHEMA 不同,用戶只能刪除其擁有的架構,或刪除對其有CONTROL權限的架構。

  14. ALTER ANY SCHEMA:賦予或拒絕在數據庫CREATE、DROP架構的權限,執行轉移架構中對象(ALTER SCHEMA Schema_Name TRANSFER [ OBJECT| Type | XML Schema Collection:: ] securable_name)時,用戶還需要securable_name的CONTROL權限

  15. CREATE SYNONYM:賦予或拒絕創建同義詞的權限。固定數據庫角色db_ddladmin和db_owner隱含此權限。在SQL Server 2005 或者更高版本中,用戶還需要ALTER SCHEMA權限才能在對於架構中創建它。

  16. CREATE AGGREGATE:賦予或拒絕創建用戶定義的來自程序集的聚合函數,必須同時擁有對程序集的引用(REFERENCES)權限。

  17. CREATE ROLE:賦予或拒絕CREATE、ALTER、DROP用戶定義的數據庫角色權限。和ALTER ANY ROLE 不同,用戶必須擁有這個角色或者對這個角色有CONTROL權限才能刪除它。

  18. ALTER ANY ROLE:賦予或拒絕CREATE、ALTER、DROP用戶定義的數據庫角色權限。

  19. CREATE QUEUE:賦予或拒絕CREATE、ALTER、DROP代理服務隊列的權限,用戶必須是隊列的擁有者才能刪除它。

  20. CONNECT:賦予或拒絕連接數據庫的權限,當創建新用戶時,該權限默認被賦予它。

  21. CONNECT REPLICATION:授予或拒絕了作爲訂閱服務器連接到數據庫以通過複製檢索發佈的能力。

  22. CHECKPOINT:賦予或拒絕對數據庫發起CHECKPOINT語句的權限,db_backupoperator固定數據庫角色有此權限

  23. SUBSCRIBE QUERY NOTIFICATIONS:賦予或拒絕當創建訂閱特定查詢結果將發生改變時查詢通知的權限

  24. AUTHENTICATE:賦予或拒絕跨數據庫模擬的能力,通常顯示的訪問是不允許的

  25. SHOWPLAN:賦予或拒絕數據庫中查詢的執行計劃的權限。

  26. ALTER ANY USER:賦予或拒絕數據庫內CREATE、DROP或ALTER用戶的權限,db_accessadmin固定數據庫角色有此權限

  27. ALTER ANY APPLICATION ROLE:賦予或拒絕CREATE、DROP或ALTER應用角色。db_securityadmin固定數據庫角色隱含此權限。

  28. ALTER ANY ASSEMBLY:賦予或拒絕CREATE、DROP或ALTER CLR程序集,db_ddladmin固定數據庫角色有此權限

  29. ALTER ANY DATASPACE:賦予或拒絕創建數據庫分區的權限。db_ddladmin固定數據庫角色有此權限

  30. CREATE MESSAGE TYPE:賦予或拒絕創建代理服務信息類型的權限,和ALTER ANY MESSAGE TYPE不同,用戶必須是信息類型的擁有者才能刪除它。

  31. ALTER ANY MESSAGE TYPE:賦予或拒絕創建代理服務的信息類型權限,當CREATE或ALTER 信息類型時指定架構集合時,用戶必須有對指定架構結合的引用(REFERENCES)權限

  32. CREATE CONTRACT:賦予或拒絕創建(CREATE)服務代理協議的權限。和ALTER ANY CONTRACT不同,用戶必須是協議的擁有者或者對協議擁有CONTROL權限的用戶才能刪除它。

  33. ALTER ANY CONTRACT:賦予或拒絕CREATE和DROP 服務代理的協議的權限,db_ddladmin固定數據庫角色有此權限

  34. CREATE SERVICE:賦予或拒絕CREATE或DROP代理服務的服務權限。創建服務的用戶必須同時擁有服務的所有隊列和協議的REFERENCES權限。和ALTER ANY SERVICE不同,用戶必須是服務的擁有者才能刪除它。

  35. ALTER ANY SERVICE:賦予或拒絕CREATE、ALTER或DROP代理服務的服務權限。創建服務的用戶必須同時擁有服務的所有隊列和協議的REFERENCES權限。

  36. CREATE REMOTE SERVICE BINDING:賦予或拒絕CREATE、ALTER、DROP代理服務的遠程服務綁定權限,和ALTER ANY REMOTE SERVICE BINDING 不同,用戶必須是遠程服務綁定的擁有者才能刪除它。

  37. ALTER ANY REMOTE SERVICE BINDING:賦予或拒絕CREATE、ALTER、DROP代理服務的遠程服務綁定權限。

  38. CREATE ROUTE:賦予或者拒絕CREATE、ALTER、DROP 代理服務路由的權限。和ALTER ANY ROUTE不同,用戶必須是路由的擁有者才能刪除它。

  39. ALTER ANY ROUTE:賦予或者拒絕CREATE、ALTER、DROP 代理服務路由的權限。

  40. CREATE FULLTEXT CATALOG:賦予或拒絕數據庫中CREATE或DROP全文目錄的權限。和ALTER ANY FULLTEXT CATALOG不同,用戶必須是全文目錄的擁有者才能刪除它。

  41. ALTER ANY FULLTEXT CATALOG:賦予或拒絕CREATE、DROP或ALTER數據庫內全文目錄的權限,db_ddladmin固定數據庫角色有此權限

  42. CREATE SYMMETRIC KEY:賦予或拒絕CREATE、DROP對稱祕鑰的權限,和ALTER ANY SYMMETRIC KEY不同,用戶必須是對稱祕鑰的擁有者或者對對稱祕鑰有CONTROL權限才能刪除它。

  43. ALTER ANY SYMMETRIC KEY:賦予或拒絕CREATE、DROP或ALTER加密使用的對稱祕鑰的權限,db_ddladmin固定數據庫角色有此權限

  44. CREATE ASYMMETRIC KEY:賦予或拒絕CREATE或DROP非對稱祕鑰的權限。和ALTER ANY ASYMMETRIC KEY不同,用戶必須是非對稱祕鑰的擁有者或者擁有對非對稱祕鑰的CONTROL權限才能刪除(DROP)它。

  45. ALTER ANY ASYMMETRIC KEY:賦予或拒絕 CREATE、DROP或ALTER加密使用的非對稱祕鑰。db_ddladmin固定數據庫角色有此權限

  46. CREATE CERTIFICATE:賦予或拒絕CREATE或DROP證書的權限。和ALTER ANY CERTIFICATE不同,用戶必須爲證書的擁有者或者對證書有CONTROL權限才能刪除(DROP)它。

  47. ALTER ANY CERTIFICATE:賦予或拒絕CREATE、DROP或ALTER證書的權限。db_ddladmin固定數據庫角色有此權限

  48. SELECT:賦予或拒絕數據庫中所有使用對象發出SELECT命令的能力。最佳實踐使用建議,不是在數據庫級別使用該權限,而在架構級別中使用它。

  49. INSERT: 賦予或拒絕對數據庫中所有適用對象發出INSERT命令的能力。最佳實踐使用建議,不是在數據庫級別使用該權限,而在架構級別中使用它。

  50. UPDATE: 賦予或拒絕對數據庫中所有適用對象發出UPDATE命令的能力。最佳實踐使用建議,不是在數據庫級別使用該權限,而在架構級別中使用它。

  51. DELETE:賦予或拒絕對數據庫中所有應用對象發起DELETE語句的權限。最佳實踐使用建議,不是在數據庫級別使用該權限,而在架構級別中使用它。

  52. REFERENCES:賦予或拒絕創建對象關係,如引用其他表的外鍵或者視圖和函數的架構綁定使用。固定數據庫角色db_ddladmin隱含此權限

  53. EXECUTE:賦予或拒絕對數據庫中的所有應用對象發起執行權限。最佳實踐使用建議,不是在數據庫級別使用該權限,而在架構級別中使用它。

  54. ALTER ANY DATABASE DDL TRIGGER:賦予或拒絕CREATE、DROP或ALTER數據庫級DDL觸發器的角色(非服務器級別),db_ddladmin固定數據庫角色有此權限

  55. CREATE DATABASE DDL EVENT NOTIFICATION:賦予或拒絕CREATE或DROP服務代理數據庫事件通知的權限。和ALTER ANY DATABASE DDL EVENT NOTIFICATION不同,用戶必須是DDL事件通知的擁有者才能刪除它。

  56. ALTER ANY DATABASE EVENT NOTIFICATION:賦予或拒絕CREATE或DROP服務代理數據庫事件通知的權限。

  57. ALTER ANY DATABASE AUDIT:賦予或拒絕CREATE、ALTER或DROP數據庫審覈的權限。

  58. VIEW DATABASE STATE:賦予或拒絕通過通過數據庫級別動態視圖或者函數查看當前數據庫的狀態權限。

  59. VIEW DEFINITION:賦予或拒絕數據庫中查看對象的潛在T-SQL 或者元數據的權限。數據庫固定角色db_securityadmin有此潛在權限。

  60. TAKE OWNERSHIP:賦予或拒絕轉移一個用戶對XML架構擁有權到另一個用戶

  61. ALTER:賦予或拒絕修改存在的數據庫權限

  62. CONTROL:這個權限等同於數據庫擁有者權限,db_owner固定數據庫角色隱含該權限

新增權限

  1. ALTER ANY COLUMN ENCRYPTION KEY:賦予或者拒絕創建、修改(ALTER)、刪除(DROP)列加密密鑰的權限(SQL Server 2016新增)。

  2. ALTER ANY COLUMN MASTER KEY:賦予或者拒絕創建或者刪除列主密鑰的權限(SQL Server 2016新增)。

  3. ALTER ANY DATABASE SCOPED CONFIGURATION:賦予或者拒絕更改數據庫配置的權限(SQL Server 2016新增)。

  4. ALTER ANY EXTERNAL DATA SOURCE:賦予或拒絕修改或者刪除外部數據庫的權限(SQL Server 2016新增)。

  5. ALTER ANY EXTERNAL FILE FORMAT:賦予或拒絕創建外部文件格式的權限

  6. KILL DATABASE CONNECTION:賦予或拒絕包含數據庫連接的KILL權限

  7. VIEW ANY COLUMN ENCRYPTION KEY DEFINITION:賦予或拒絕查看列祕鑰定義的查看權限

  8. VIEW ANY COLUMN MASTER KEY DEFINITION:賦予或拒絕查看列祕鑰定義查看權限

  9. ALTER ANY MASK:賦予或拒絕添加、替換或刪除對列的屏蔽的權限,同時需要對錶的 ALTER 權限(SQL Server 2016新增)。

  10. UNMASK

  11. EXECUTE ANY EXTERNAL SCRIPT:賦予或拒絕執行外部腳本的權限。

在非master庫下不能給用戶賦予創建數據庫的權限,否則報如下錯誤:

只能在master 數據庫中授予CREATE DATABASE 權限。

消息0,級別11,狀態0,第0 行

當前命令發生了嚴重錯誤。應放棄任何可能產生的結果。

 

查看各個安全主題具有的權限

 

除數據庫安全主題外,數據庫中還有其他20個安全主題,分別爲:

    USER | ROLE  |  APPLICATION ROLE | ASSEMBLY | SYMMETRIC KEY | ASYMMETRIC  KEY

    | CERTIFICATE | DATABASE SCOPED CREDENTIAL   | SCHEMA  | XML SCHEMA  COLLECTION  | OBJECT

    | FULLTEXT CATALOG | FULLTEXT STOPLIST      

    | MESSAGE TYPE| REMOTE SERVICE BINDING | ROUTE   | CONTRACT  

    | SEARCH PROPERTY LIST  | SERVICE    

    | TYPE  

我們可以通過系統函數 sys.fn_builtin_permissions 查到各安全主題所具有的權限,如下給出USER的查詢:

SELECT *
FROM sys.fn_builtin_permissions('USER')

可以從permission_name字段中看到,可以爲USER賦予或拒絕四個權限。其他安全主題可以授予的權限,有興趣的讀者可以自行查看結果。

 

數據庫固定角色所具有的權限:

  • db_owner:數據庫擁有者,類似於賦予用戶對數據庫的CONTROL權限

  • db_accessadmin

    • CREATE SCHEMA

    • ALTER ANY USER

    • CONNECT

  • db_securityadmin

    • ALTER ANY APPLICATION ROLE

    • ALTER ANY ROLE

    • VIEW DEFINITION

    • CREATE SCHEMA

  • db_ddladmin

    • ALTER ANY ASSEMBLY

    • ALTER ANY ASYMMETRIC KEY

    • ALTER ANY CERTIFICATE

    • ALTER ANY CONTRACT

    • ALTER ANY DATABASE DDL TRIGGER

    • ALTER ANY DATABASE EVENT NOTIFICATION

    • ALTER ANY DATASPACE

    • ALTER ANY EXTERNAL LIBRARY

    • ALTER ANY FULLTEXT CATALOG

    • ALTER ANY MESSAGE TYPE

    • ALTER ANY REMOTE SERVICE BINDING

    • ALTER ANY ROUTE

    • ALTER ANY SCHEMA

    • ALTER ANY SERVICE

    • ALTER ANY SYMMETRIC KEY

    • CREATE AGGREGATE

    • CREATE AGGREGATE

    • CREATE DEFAULT

    • CREATE FUNCTION

    • CREATE PROCEDURE

    • CREATE QUEUE

    • CREATE RULE

    • CREATE SYNONYM

    • CREATE TABLE

    • CREATE TYPE

    • CREATE VIEW

    • CREATE XML SCHEMA COLLECTION

    • CHECKPOINT

    • REFERENCES

  • db_backupoperator

    • BACKUP DATABASE

    • BACKUP LOG

    • CHECKPOINT

  • db_datareader

    • 賦予對數據庫的SELECT權限

  • db_datawriter

    • 賦予對數據庫的INSERT權限

    • 賦予對數據庫的UPDATE權限

    • 賦予對數據庫的DELETE權限

  • db_denydatareader

    • 拒絕對數據庫的SELECT權限

  • db_denydatawriter

    • 拒絕對數據庫的INSERT權限

    • 拒絕對數據庫的UPDATE權限

    • 拒絕對數據庫的DELETE權限

注意數據庫角色public不屬於數據庫固定角色,但所有數據庫用戶都是其成員,且無法修改。

public:在SQL Server 2006中有如下兩個權限,並且可以回收

  • VIEW ANY COLUMN MASTER KEY DEFINITION

  • VIEW ANY COLUMN ENCRYPTION KEY DEFINITION

無論SQL Server服務器級角色public,還是數據庫級角色public,其最初都不能訪問任何用戶創建的對象。數據庫角色public有許多授予系統對象的權限,這是管理內部操作所必需的。詳細可以參閱《SQL Server public 角色權限管理》一文。

當然,除了數據庫中的這些角色外,用戶還可以創建自己的數據庫角色,並賦予需要的不同權限。

 

賦予或拒絕用戶、角色、應用角色權限

 

賦予或拒絕用戶、角色、應用角色權限語句比較簡單,大體可以分爲三類,下面分別給出一些示例:

--示例1:
--賦予用戶對數據庫安全主體的權限
GRANT SELECT TO Jack
GRANT ALTER ANY SCHEMA TO Jack WITH GRANT OPTION
--拒絕用戶對數據庫安全主體的權限
DENY BACKUP TO Jack
DENY BACKUP LOG TO Jack WITH GRANT OPTION

爲用戶賦予安全主題(除數據庫以外的安全主題)權限,其格式爲“ON 安全主題說明:: 安全主題名”,示例如下:

--示例2:
--爲用戶Jack 賦予查看架構test 定義的權限
GRANT VIEW DEFINITION ON SCHEMA::test TO Jack
--賦予用戶Jack 查看架構dbo下表test的權限
GRANT SELECT ON OBJECT::dbo.test TO Jack
--賦予用戶Jack 查看架構dbo下表test的列a、d的權限
GRANT SELECT ON OBJECT::dbo.test(a,d) TO Jack
--賦予用戶Jack 執行架構dbo下過程SimpleProc的權限
GRANT EXEC ON OBJECT::dbo.SimpleProc TO Jack

爲用戶賦予系統對象的權限格式如下:

 

GRANT { SELECT | EXECUTE } ON [ sys.]system_object TO principal

當然,我們也可以通過《SQL Server 中深入理解GRANT、REVOKE 和 DENY 的區別》的方式去深入瞭解各種權限。

 

查看用戶或角色所具有的權限

 

系統過程 sp_helprotect 可以幫助查看上面的第一種賦予或拒絕的權限

--查看哪些用戶對錶test有什麼樣的權限
EXEC sp_helprotect 'test'
--查看用戶Jack有哪些權限
EXEC sp_helprotect NULL,Jack
--查看dbo授權的用戶的所有權限
EXEC sp_helprotect NULL,NULL,dbo
--查看所有對象的權限
EXEC sys.sp_helprotect NULL,NULL,NULL,'o'

因爲系統過程sp_helprotect查看的權限不全,所以如果需要查看完整的權限,可以使用數據庫權限動態視圖 sys.database_permissions  ,結合數據庫安全主題對象視圖sys.database_principals 及其他相關視圖查看相關的權限,具體參考下面的腳本:

--0 = 數據庫
SELECT CASE state WHEN 'D' THEN 'DENY '
      ELSE 'GRANT ' END
      +permission_name COLLATE Chinese_PRC_90_CI_AI
      +' TO '
      +QUOTENAME(ds.name,'[')
      +CASE WHEN state='W' THEN ' WITH GRANT OPTION' ELSE '' END
FROM sys.database_permissions dp
LEFT JOIN sys.database_principals ds
ON dp.grantee_principal_id=ds.principal_id
WHERE class=0 AND ds.principal_id=5
--1 = 對象或列
SELECT CASE state WHEN 'D' THEN 'DENY '
      ELSE 'GRANT ' END
      +permission_name COLLATE Chinese_PRC_90_CI_AI
      +'ON OBJECT::'+QUOTENAME(s.name,'[')+'.'
      +quotename(o.name,'[')
      +CASE WHEN c.NAME IS NOT NULL THEN'('+QUOTENAME(c.name,'[')+') '
            ELSE '' END
      +' TO '
      +QUOTENAME(ds.name,'[')
      +CASE WHEN state='W' THEN ' WITH GRANT OPTION' ELSE '' END
FROM sys.database_permissions dp
LEFT JOIN sys.database_principals ds
ON dp.grantee_principal_id=ds.principal_id
LEFT JOIN sys.objects o
ON dp.major_id=o.object_id
LEFT JOIN sys.schemas s
ON o.schema_id=s.schema_id
LEFT JOIN sys.columns c ON dp.minor_id=c.column_id
      AND dp.major_id=c.object_id
WHERE grantee_principal_id=5 AND class=1
--3 = 架構
SELECT CASE state WHEN 'D' THEN 'DENY '
      ELSE 'GRANT ' END
      +permission_name COLLATE Chinese_PRC_90_CI_AI
      +' ON SCHEMA::'
      +s.name
      +' TO '
      +QUOTENAME(ds.name,'[')
      +CASE WHEN state='W' THEN ' WITH GRANT OPTION' ELSE '' END
FROM sys.database_permissions dp
LEFT JOIN sys.database_principals ds ON dp.grantee_principal_id=ds.principal_id
LEFT JOIN sys.schemas s ON dp.major_id=s.schema_id
WHERE class=3 AND grantee_principal_id=5
--4 = 數據庫主體
--[ USER :: database_user ] 
--     | [ ROLE :: database_role ] 
--     | [ APPLICATION ROLE :: application_role ]
SELECT CASE state WHEN 'D' THEN 'DENY '
      ELSE 'GRANT ' END
      +permission_name COLLATE Chinese_PRC_90_CI_AI
      +CASE s.type WHEN 'U' THEN '  ON USER::'
      WHEN 'R' THEN  ' ON ROLE::'
      WHEN 'A' THEN ' ON APPLICATION ROLE::' END
      +s.name
      +' TO '
      +QUOTENAME(d.name,'[')
      +CASE WHEN state='W' THEN ' WITH GRANT OPTION'
            ELSE '' END
FROM sys.database_permissions dp
LEFT JOIN sys.database_principals s ON dp.major_id=s.principal_id
LEFT JOIN sys.database_principals d ON dp.grantee_principal_id=d.principal_id
WHERE class=4 AND grantee_principal_id=5
--5 = 程序集適用範圍:SQL Server 2008通過SQL Server 2019。
SELECT * FROM sys.assemblies
SELECT CASE state WHEN 'D' THEN 'DENY '
      ELSE 'GRANT ' END
      +permission_name COLLATE Chinese_PRC_90_CI_AI
      +' ON ASSEMBLY::'
      +QUOTENAME(ab.name,'[')
      +' TO '
      +QUOTENAME(ds.name,'[')
      +CASE WHEN state='W' THEN ' WITH GRANT OPTION'
            ELSE '' END
FROM sys.database_permissions dp
LEFT JOIN sys.database_principals ds
ON dp.grantee_principal_id=ds.principal_id
LEFT JOIN sys.assemblies ab
ON dp.major_id=ab.assembly_id
WHERE class=5 AND grantee_principal_id=5
--6 = 類型
SELECT * FROM sys.types
SELECT CASE state WHEN 'D' THEN 'DENY '
      ELSE 'GRANT ' END
      +permission_name COLLATE Chinese_PRC_90_CI_AI
      +' ON TYPE::'
      +QUOTENAME(s.name,'[')+'.'
      +QUOTENAME(t.name,'[')
      +' TO '
      +QUOTENAME(ds.name,'[')
      +CASE WHEN state='W' THEN ' WITH GRANT OPTION'
            ELSE '' END
FROM sys.database_permissions dp
LEFT JOIN sys.database_principals ds
ON dp.grantee_principal_id=ds.principal_id
LEFT JOIN sys.types t
ON dp.major_id=t.user_type_id
LEFT JOIN sys.schemas s ON t.schema_id=s.schema_id
WHERE class=6 AND grantee_principal_id=5
--10 = XML 架構集合的適用範圍:SQL Server 2008 到SQL Server 2019。
SELECT * FROM sys.xml_schema_namespaces
SELECT * FROM sys.xml_schema_collections
SELECT CASE state WHEN 'D' THEN 'DENY '
      ELSE 'GRANT ' END
      +permission_name COLLATE Chinese_PRC_90_CI_AI
      +' ON XML SCHEMA COLLECTION::'
      +QUOTENAME(xmlsc.name,'[')
      +' TO '+QUOTENAME(ds.name,'[')
      +CASE WHEN state='W' THEN ' WITH GRANT OPTION'
            ELSE '' END
FROM sys.database_permissions dp
LEFT JOIN sys.database_principals ds
ON ds.principal_id=dp.grantee_principal_id
LEFT JOIN sys.xml_schema_collections xmlsc
ON dp.major_id=xmlsc.xml_collection_id
WHERE grantee_principal_id=5 AND class=10
--15 = 消息類型適用範圍:SQL Server 2008通過SQL Server 2019。
--授予對Service Broker 消息類型的權限。
--SELECT * FROM sys.service_message_types
SELECT CASE state WHEN 'D' THEN 'DENY '
      ELSE 'GRANT ' END
      +permission_name COLLATE Chinese_PRC_90_CI_AI
      +' ON message type::'
      +QUOTENAME(m.name,'[')
      +' TO '+QUOTENAME(ds.name,'[')
      +CASE WHEN state='W' THEN ' WITH GRANT OPTION'
            ELSE '' END
FROM sys.database_permissions dp
LEFT JOIN sys.database_principals ds
ON ds.principal_id=dp.grantee_principal_id
LEFT JOIN sys.service_message_types m
ON dp.major_id=m.message_type_id
WHERE grantee_principal_id=5 AND class=15           
--16 = 服務約定適用範圍:SQL Server 2008通過SQL Server 2019。
SELECT * FROM sys.service_contracts
SELECT CASE state WHEN 'D' THEN 'DENY '
      ELSE 'GRANT ' END
      +permission_name COLLATE Chinese_PRC_90_CI_AI
      +' ON Contract::'
      +QUOTENAME(s.name,'[')
      +' TO '+QUOTENAME(ds.name,'[')
      +CASE WHEN state='W' THEN ' WITH GRANT OPTION'
            ELSE '' END
FROM sys.database_permissions dp
LEFT JOIN sys.database_principals ds
ON ds.principal_id=dp.grantee_principal_id
LEFT JOIN sys.service_contracts s
ON dp.major_id=s.service_contract_id
WHERE grantee_principal_id=5 AND class=16
--17 = 服務適用範圍:SQL Server 2008通過SQL Server 2019。
SELECT CASE state WHEN 'D' THEN 'DENY '
      ELSE 'GRANT ' END
      +permission_name COLLATE Chinese_PRC_90_CI_AI
      +' ON Service::'
      +QUOTENAME(s.name,'[')
      +' TO '+QUOTENAME(ds.name,'[')
      +CASE WHEN state='W' THEN ' WITH GRANT OPTION'
            ELSE '' END
FROM sys.database_permissions dp
LEFT JOIN sys.database_principals ds
ON ds.principal_id=dp.grantee_principal_id
LEFT JOIN sys.services s
ON dp.major_id=s.service_id
WHERE grantee_principal_id=5 AND class=17
--19 = 的路由適用範圍:SQL Server 2008通過SQL Server 2019。
SELECT CASE state WHEN 'D' THEN 'DENY '
      ELSE 'GRANT ' END
      +permission_name COLLATE Chinese_PRC_90_CI_AI
      +' ON Route::'
      +QUOTENAME(r.name,'[')
      +' TO '+QUOTENAME(ds.name,'[')
      +CASE WHEN state='W' THEN ' WITH GRANT OPTION'
            ELSE '' END
FROM sys.database_permissions dp
LEFT JOIN sys.database_principals ds
ON ds.principal_id=dp.grantee_principal_id
LEFT JOIN sys.routes r
ON dp.major_id=r.route_id
WHERE grantee_principal_id=5 AND class=19
--23 = 全文目錄適用範圍:SQL Server 2008通過SQL Server 2019。
SELECT * FROM sys.fulltext_catalogs
SELECT * FROM sys.database_permissions
WHERE class=23
--29 = 全文目錄停止列表適用範圍:SQL Server 2008通過SQL Server 2019。
SELECT * FROM sys.fulltext_stoplists 
SELECT CASE state WHEN 'D' THEN 'DENY '
      ELSE 'GRANT ' END
      +permission_name COLLATE Chinese_PRC_90_CI_AI
      +' ON fulltext stoplist::'
      +QUOTENAME(f.name,'[')
      +' TO '+QUOTENAME(ds.name,'[')
      +CASE WHEN state='W' THEN ' WITH GRANT OPTION'
            ELSE '' END
FROM sys.database_permissions dp
LEFT JOIN sys.database_principals ds
ON ds.principal_id=dp.grantee_principal_id
LEFT JOIN sys.fulltext_stoplists  f
ON dp.major_id=f.stoplist_id
WHERE grantee_principal_id=5 AND class=29
--24 = 對稱密鑰適用範圍:SQL Server 2008通過SQL Server 2019。
SELECT * FROM sys.symmetric_keys
SELECT * FROM sys.database_permissions dp
WHERE class=24
SELECT CASE state WHEN 'D' THEN 'DENY '
      ELSE 'GRANT ' END
      +permission_name COLLATE Chinese_PRC_90_CI_AI
      +' ON SYMMETRIC KEY::'
      +QUOTENAME(asy.name,'[')
      +' TO '+QUOTENAME(ds.name,'[')
      +CASE WHEN state='W' THEN ' WITH GRANT OPTION'
            ELSE '' END
FROM sys.database_permissions dp
LEFT JOIN sys.database_principals ds
ON ds.principal_id=dp.grantee_principal_id
LEFT JOIN sys.symmetric_keys asy
ON dp.major_id=asy.symmetric_key_id
WHERE grantee_principal_id=5 AND class=24
--25 = 證書適用範圍:SQL Server 2008通過SQL Server 2019。
SELECT CASE state WHEN 'D' THEN 'DENY '
      ELSE 'GRANT ' END
      +permission_name COLLATE Chinese_PRC_90_CI_AI
      +' ON CERTIFICATE::'
      +QUOTENAME(c.name,'[')
      +' TO '+QUOTENAME(ds.name,'[')
      +CASE WHEN state='W' THEN ' WITH GRANT OPTION'
            ELSE '' END
FROM sys.database_permissions dp
LEFT JOIN sys.database_principals ds
ON ds.principal_id=dp.grantee_principal_id
LEFT JOIN sys.certificates c
ON dp.major_id=c.certificate_id
WHERE grantee_principal_id=5 AND class=25
--26 = 非對稱密鑰適用範圍:SQL Server 2008通過SQL Server 2019。
SELECT CASE state WHEN 'D' THEN 'DENY '
      ELSE 'GRANT ' END
      +permission_name COLLATE Chinese_PRC_90_CI_AI
      +' ON ASYMMETRIC KEY::'
      +QUOTENAME(asy.name,'[')
      +' TO '+QUOTENAME(ds.name,'[')
      +CASE WHEN state='W' THEN ' WITH GRANT OPTION'
            ELSE '' END
FROM sys.database_permissions dp
LEFT JOIN sys.database_principals ds
ON ds.principal_id=dp.grantee_principal_id
LEFT JOIN sys.asymmetric_keys asy
ON dp.major_id=asy.asymmetric_key_id
WHERE grantee_principal_id=5 AND class=26

當然這並不是最高效的查看用戶權限的方式,看過我前面寫的博文的同學,或者想要高效查看管理數據用戶或角色權限的同學,可以通過創建《克隆SQL Server 數據庫用戶及權限 V1.1》中的過程 sp_DBA_userPermisionsClone ,並執行該過程來查看用戶、角色或應用角色在某數據庫的全部權限。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章