SQL Server 用角色(Role)管理資料庫許可權

来源:http://www.cnblogs.com/wy123/archive/2017/02/07/6305540.html
-Advertisement-
Play Games

當資料庫越來越多,連接到資料庫的應用程式,伺服器,賬號越來越多的時候,為了既能達到滿足賬號操作數據許可權需求,又不擴大其操作許可權,保證資料庫的安全性,有時候需要用角色來參與到許可權管理中,通過角色做一個許可權與訪問用不之前的映射,可以更加方便地管理許可權。 用SETUSER 切換到上面建的ReadUser賬 ...


 

當資料庫越來越多,連接到資料庫的應用程式,伺服器,賬號越來越多的時候,為了既能達到滿足賬號操作數據許可權需求,又不擴大其操作許可權,保證資料庫的安全性,有時候需要用角色來參與到許可權管理中,通過角色做一個許可權與訪問用不之前的映射,可以更加方便地管理許可權。

USE master
GO
--創建一個用戶
CREATE LOGIN ReadUser WITH PASSWORD ='123qwe!@#',DEFAULT_DATABASE=DBTest


USE DBTest
GO
 --創建用戶,指定到上面
CREATE USER ReadUser FOR LOGIN ReadUser WITH DEFAULT_SCHEMA = dbo

 

用SETUSER 切換到上面建的ReadUser賬號下麵,通過print Session_user發現已經切換到了ReadUser,以ReadUser的身份執行一個查詢,

此時提示ReadUser沒有DetailTable的SELECT 許可權

以管理員身份授權給ReadUser查詢dbo.DetailTable表的許可權

再次以ReadUser的身份執行上述查詢,這次發現可以正常執行了

如果允許ReadUser這個賬號對當前庫多張表都要有查詢的全新,就要將GRANT SELECT ON TableName重覆N次,
那麼問題就來了,如果此時需要再建一個同樣許可權的用戶,ReadUser2,授予同樣的許可權,又要重覆N此GRANT操作?

此時就需要藉助角色這一資料庫對象來管理許可權,將User加入到某一個角色中,來避免每次新增一個User都要執行一遍授權操作。

 

首先用管理員許可權創建一個角色ReadRole

 

然後依次執行如下操作,將之前授權給ReadUser的許可權給Revoke掉,

1,新建一個名稱為ReadRole的角色

2,將多張表的查詢許可權授予ReadRole這一角色

3,將User加入到這個角色中

執行完成之後,我們在來嘗試UserRead這個角色的許可權,可以發現:角色有的許可權,ReadUser也都有了

 

如果此時再新建一個ReadUser2

此時切換到ReadUser2的身份下,發現ReadUser2也具備了ReadRole這個自定義角色的許可權

 

上述的ReadRole是自定義的角色,上面給他授權的是當前資料庫中的部分表的SELECT許可權
如果需要全庫的所有表的SELECT許可權,就可以藉助DataBase Role來實現了,將用戶加入到DataBase級別的db_dataReader這個角色中
如下截圖

DataBase級別的角色作用範圍是整個DB的,比如db_datareader,db_datawriter都是作用在資料庫所有的對象
對於這種範圍比較大而不適合使用的場景,就可以採用類似上述自定義角色,通過給角色授予指定範圍內的許可權的方式來實現用戶許可權管理

 

角色不僅可以在表上做許可權控制和管理,也可以管理視圖(查詢),存儲過程(執行),函數(查詢),Sequence(Sequence是Update)等對象上的操作許可權,通過授權給角色許可權,把某一列用戶加入到某一個角色中,用角色來管理用戶和資料庫對象之間的許可權管理,可以做到更加統一地管理許可權。

 

最後,附上兩個腳本

1.查詢某個角色用哪些許可權

--查詢某個角色擁有的許可權
select USER_NAME(p.grantee_principal_id) AS principal_name,
            dp.principal_id,
            dp.type_desc AS principal_type_desc,
            p.class_desc,
            OBJECT_NAME(p.major_id) AS object_name,
            p.permission_name,
            p.state_desc AS permission_state_desc
from sys.database_permissions p 
            INNER JOIN sys.database_principals dp on  p.grantee_principal_id = dp.principal_id 
where USER_NAME(p.grantee_principal_id) =  'ReadRole' --角色名稱

2.查詢某個User有哪些角色的許可權(User數據哪一個(多個)角色)

--某個User有哪些角色的許可權(User數據哪一個(多個)角色)
SELECT u.name, r.name
FROM sys.database_role_members AS m
        INNER JOIN sys.database_principals AS r ON m.role_principal_id = r.principal_id
        INNER JOIN sys.database_principals AS u ON u.principal_id = m.member_principal_id
WHERE u.name = 'ReadUser'; --UserName

3.查詢某個賬號有哪些許可權,直接授權給賬號的,而不是通過角色繼承來的

--查詢某個賬號有哪些許可權,直接授權給賬號的,而不是通過角色繼承來的
select USER_NAME(p.grantee_principal_id) AS principal_name,
        p.grantee_principal_id,
        dp.principal_id,
        dp.type_desc AS principal_type_desc,
        p.class_desc,
        OBJECT_NAME(p.major_id) AS object_name,
        p.permission_name,
        p.state_desc AS permission_state_desc
from sys.database_permissions p 
        INNER JOIN sys.database_principals dp on  p.grantee_principal_id = dp.principal_id 
where USER_NAME(p.grantee_principal_id) = 'ReadUser'

 

4.查詢一個UserName擁有的所有許可權(通過角色集成的許可權和自身具備的許可權)

--查詢一個UserName擁有的角色以及角色擁有的操作對象
;WITH LoginName
AS
(
  SELECT u.name                       AS LoginName, 
         r.name                      AS RoleName,
         role_principal_id            AS PrincipalId
  FROM sys.database_role_members AS m
        INNER JOIN sys.database_principals AS r ON r.principal_id = m.role_principal_id 
        INNER JOIN sys.database_principals AS u ON u.principal_id = m.member_principal_id
),
UserPermission
AS
(
    select USER_NAME(p.grantee_principal_id)    AS principal_name,
            dp.principal_id            AS principal_id,
            dp.type_desc            AS principal_type_desc,
            p.class_desc            AS class_desc,
            OBJECT_NAME(p.major_id)        AS object_name,
            p.permission_name            AS permission_name,
            p.state_desc            AS permission_state_desc
    from sys.database_permissions p 
            INNER JOIN sys.database_principals dp on  p.grantee_principal_id = dp.principal_id 
)
SELECT * FROM
(
    --通過角色獲取的許可權對象
    SELECT  u.LoginName,
            u.RoleName,
            p.principal_type_desc,
            p.class_desc,
            p.permission_name,
            p.object_name,
            p.permission_state_desc
    FROM LoginName u left join UserPermission p on p.principal_name = u.RoleName
    WHERE u.LoginName = '***'

    UNION ALL

    --直接授權給賬號的許可權對象
    select     '***'            AS LoginName,
            NULL                            AS RoleName,
            dp.type_desc                    AS principal_type_desc,
            p.class_desc                    AS class_desc,
            p.permission_name                    AS permission_name,
            OBJECT_NAME(p.major_id)                AS object_name,
            p.state_desc                    AS permission_state_desc
    from sys.database_permissions p 
            INNER JOIN sys.database_principals dp on  p.grantee_principal_id = dp.principal_id 
    where USER_NAME(p.grantee_principal_id) = '***'
)t WHERE 1=1 
order by class_desc,RoleName ,principal_type_desc

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ### 需求:1. textView 需要placeholder用來提示輸入2. textView 要做字數限制 3. textView 禁止表情符號的輸入### 思考:因為需求比較通用,便想通過自定義SJTextView來實現:1. placeholder 通過在textView上添加一個透明的l... ...
  • `ConstraintLayout`讓你可以在很平的view結構(沒有多層佈局嵌套)中構建一個複雜的佈局結構. 有點像`RelativeLayout`, 所有的view都是根據它和兄弟View和父layout的關係佈局的, 但是它比`RelativeLayout`要更加靈活, 在Layout Edi... ...
  • 1. 功能介紹 1.1. Volley Volley 是 Google 推出的 Android 非同步網路請求框架和圖片載入框架。在 Google I/O 2013 大會上發佈。 名字由來:a burst or emission of many things or a large amount at ...
  • 備份: 還原: 導入 導出數據: 參數說明: h:指明資料庫宿主機的IP u:指明資料庫的用戶名 p:指明資料庫的密碼 d:指明資料庫的名字 c:指明collection的名字 f:指明要導出那些列 o:指明到要導出的文件名 q:指明導出數據的過濾條件 ...
  • 1.安裝 brew install mongodb 2.啟動 mongod config /usr/local/etc/mongod.conf 3.顯示資料庫列表 show dibs 4.顯示當前資料庫中的集合(類似關係資料庫中的表) show collections 5.顯示用戶 show use ...
  • 下麵,列出一些實用的表達式: 1,路徑取文件名 2,空字元設置預設值 1 LEN([STRING_COLUMN]) == 0 ? "default value" : [STRING_COLUMN] 2 ISNULL([STRING_COLUMN]) ? "default value" : [STRI ...
  • 淺談Oracle12c 資料庫、用戶、CDB與PDB之間的關係名詞介紹:資料庫:資料庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫,它產生 於距今六十多年前,隨著信息技術和市場的發展,特別是二十世紀九十年代以 後,數據管理不再僅僅是存儲和管理數據,而轉變成用戶所需要的各種數據管 理 ...
  • 轉自:http://samyubw.blog.51cto.com/978243/223773 MySQL的每個單表中所創建的索引長度是有限制的,且對不同存儲引擎下的表有不同的限制。 在MyISAM表中,創建組合索引時,創建的索引長度不能超過1000,註意這裡索引的長度的計算是根據表欄位設定的長度來標 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...