Security5:授予許可權

来源:http://www.cnblogs.com/ljhdo/archive/2017/08/07/5610552.html
-Advertisement-
Play Games

SQL Server授予用戶訪問對象的許可權,通常的模式是:Grants permissions on a securable to a principal(user or login),也就是說,授予許可權的命令分為三部分:Permission,Securable 和 Principal,用一句話來解 ...


SQL Server授予用戶訪問對象的許可權,通常的模式是:Grants permissions on a securable to a principal(user or login),也就是說,授予許可權的命令分為三部分:Permission,Securable 和 Principal,用一句話來解釋這三個概念:授予 Principal 操作 Securable 的 Permission。Principal是被授予許可權的主體,是被授與者(Grantee),是Login,User或Role。Securable是table,view,SP等對象,是Principal操作的對象;有時Principal也會作為Securable,被Principal操縱。在授予許可權的子句中,沒有主語,這是因為,只能授予已有的許可權,而最原始的主體是在創建SQL Server實例時指定的,該賬號擁有最高的許可權,通過該賬號把許可權授予相應的安全主體。許可權可以授予(GRANT)或禁止(DENY),也可以被回收(REVOKE),SQL Server通過命令GRANT,允許主體對安全對象做某些操作,通過命令DENY禁止主體對安全對象做某些操作,通過REVOKE命令收回對主體已授予(GRANT)或已禁止(DENY)的許可權。

在SQL Server的安全模型中,安全主體主要分為兩個級別:實例級別和資料庫級別,每一個級別都需要一個與之對應的安全主體:Login是SQL Server實例級別的安全主體,用於登陸實例時的驗證,驗證方式分為Windows驗證(通過Windows域賬戶驗證登陸許可權)和SQL Server驗證(通過賬號和密碼驗證登陸許可權),而User是資料庫級別的安全主體,用於訪問資料庫。Login和User可以通過SID(安全標識)關聯起來,如果Login沒有關聯User,那麼Login只能通過Public角色去訪問資料庫;如果User沒有關聯Login,那麼該User是孤立用戶,只能通過模擬許可權被使用。一般情況下,一個User只能關聯一個Login。

在SQL Server的安全模型中,sa和dbo 這兩個安全主體擁有絕對控制許可權,sa是login,屬於實例級別的主體,dbo是user,屬於資料庫級別的主體。每一個屬於sysadmin伺服器角色的Login都會映射到資料庫級別的dbo用戶,也就是說,實例級別的login不同,資料庫級別的user是相同的,都是dbo,但是,這些Login的SID都是相同的。

SQL Server 資料庫引擎管理一個層次結構的實體集合,實體就是安全對象(Securable),最重要的安全對象是Server和Database,最重要的安全主體(Principal)是Login和User,如下圖所示:

  • 左側為安全主體:安全主體(Principal)分為三種:在Windows 級別上是Login,在SQL Server實例級別上是Login和實例級別的Role,在資料庫級別是 User和資料庫級別的Role。
  • 右側為安全對象(Securable):對於安全對象(Securable)而言,SQL Server 實例是Database的集合,而Database是User,Role,Schema等的集合,Schema是資料庫對象的集合,資料庫對象是指Table,View,SP,Function等,操作不同的對象,需要的許可權不同。

SQL Server的安全模型是有層次結構的,對安全對象的許可權存在繼承關係,對父安全對象上設置的許可權,會自動繼承到子安全對象上,例如,擁有架構(Schema)的CONTROL許可權,這意味著,對該架構下的所有的資料庫對象都用於CONTROL許可權。

通常情況下,許可權的管理都是針對資料庫對象(Table,View,SP,Schema等)的,資料庫對象的主要許可權如下列表所示:

  • ALTER:用於修改資料庫對象的定義,是DDL級別的許可權;授予用戶對特定Schema的ALTER許可權,這意味著,用戶可以alter, create, 或 drop 該Schema下的任何資料庫對象。
  • VIEW DEFINITION:用於查看資料庫對象的定義;
  • EXECUTE:用於執行SP,函數的許可權;
  • DELETE,INSERT,UPDATE和SELECT:用於對數據表或視圖執行增刪改查操作,是DML級別的許可權;
  • REFERENCES:授予引用的許可權,用於在當前表中引用其他數據表主鍵的許可權;
  • CONTROL:控制權,被授予許可權的用戶,實際上擁有操作對象的所有許可權。The grantee effectively has all defined permissions on the securable.

用戶可以通過表值函數:sys.fn_builtin_permissions('object') 查看SQL Server支持的對object可授予許可權的列表。

一,授予用戶訪問資料庫對象的許可權

在創建Login和User之後(可以參考《Security1:登錄和用戶》),把訪問Object的許可權授予資料庫用戶(User)或角色(Role),語法如下:

GRANT <permission> [ ,...n ] 
ON OBJECT :: schema_name.object_name[ ( column [ ,...n ] ) ] 
TO [Database_user | Database_role] [ ,...n ]

對於Table,View等資料庫對象,可以把許可權控制在column的粒度上,只允許用戶訪問特定的數據列;如果在GRANT子句中忽略column,那麼用戶可以訪問整個table或view的所有列。

把訪問Schema的許可權授予資料庫用戶或角色,語法如下:

GRANT permission  [ ,...n ] 
ON SCHEMA :: schema_name  
TO database_principal [ ,...n ]  

1,授予對數據表的select許可權

GRANT SELECT 
ON OBJECT::Person.Address 
TO RosaQdM; 

2,授予執行SP的許可權

GRANT EXECUTE 
ON OBJECT::hr.usp_UpdateEmployeeHireInfo  
TO Recruiting11; 

3,授予引用數據列的許可權
以下腳本授予用戶Wanida引用資料庫對象 HumanResources.vEmployee的數據列 BusinessEntityID作為外鍵。

GRANT REFERENCES (BusinessEntityID) 
ON OBJECT::hr.view_Employee   
TO Wanida WITH GRANT OPTION;

二,通過創建Role授予許可權

授予許可權的方法,共有兩種,第一種方法是把許可權直接授予用戶,

  • 可以授予對單個資料庫對象(單個數據表或視圖等)的許可權,
  • 也可以授予用戶操作Schema的許可權,由於Schema是objects的容器,授予用戶操作Schema的許可權,就等同於授予操作Schema下所有objects的許可權;

第二種方法是把許可權授予資料庫角色Role,然後把角色Role的許可權授予用戶,那樣,用戶就擁有Role的所有許可權,以下代碼,通過創建Role,把許可權授予特定的用戶:

--create login
create login [domain\user] 
from windows
go

--create user
create user [domain\user]  
for login [domain\user] 
go

--create role
create role role_name
go

--create schema
create schema schema_name
go

--grant permission on schema to role
grant select,execute
on schema::schema_name
to role_name;

--grant permission on object to role
grant select ,insert
on object::schema_name.object_name
to role_name;

--add member
alter role role_name
add member [domain\user] ;
go
View Code

三,通過創建許可權模擬來授予許可權

在SQL Server的安全模型中,模擬(IMPERSONATE )許可權的安全對象是User或Login,被授予者(Grantee )有許可權模擬指定用戶,在其安全上下文執行特定的操作。

例如,user1授予模擬user2的許可權,當user2的安全上下文有足夠的許可權,而user1沒有時,通過許可權模擬,user1能夠在user2的許可權上下文中執行查詢請求:

GRANT IMPERSONATE 
ON USER:: user2 
TO user1;

通過執行EXECUTE AS 命令模擬用戶的許可權,用戶user1就運行在user2的安全上下文中,例如,user1在登陸資料庫之後,模擬user2的許可權:

EXECUTE AS USER = 'user2';

通過執行 REVERT 命令退出許可權模擬,返回到用戶原始的安全上下文中:

REVERT;

一般情況下,對於特殊的管理任務,需要創建孤立用戶,給孤立用戶授予特定的許可權,並把模擬孤立用戶的許可權授予其他用戶,這些人就有許可權執行特定的管理任務。

 

參考文檔:

Permissions (Database Engine)

GRANT Object Permissions (Transact-SQL)

Basic SQL Server Security concepts - logins, users, and principals

Basic SQL Server Security concepts - permissions and special principals: sa, dbo, guest


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

-Advertisement-
Play Games
更多相關文章
  • 閱讀目錄 CockroachDB是什麼 環境部署 實戰 性能測試 結語 一、CockroachDB是什麼 CockroachDB(https://www.cockroachlabs.com)是Google備受矚目的Spanner的開源模仿,承諾提供一種高存活性、強一致性,可橫向擴展的SQL資料庫。主 ...
  • 平時我都用Navicat for MySQL工具進行導入的,但今天碰到的一個.sql的文件太大了,超過了1G。用Navicat from MySQL 時執行了1個多小時,還報了許多錯誤出來(導入時設置略過錯誤,所以最終還是完成了)。我嘗試用別的方式進行導入。上網查了一個,原來MySQL自帶導入工作: ...
  • --用oracle系統許可權的賬號 登陸 -- 1.創建用戶 --2.賦予許可權 --3.創建目錄 dictionary create directory directory_name as 'D:\oracleEnv\Oracle\product\11.2.0\db\backup'; --路徑可以自己 ...
  • 本文旨在展示CDH基於Kerberos身份認證和基於Sentry的許可權控制功能的測試示例。 1. 準備測試數據 1 2 3 4 5 6 cat /tmp/events.csv 10.1.2.3,US,android,createNote 10.200.88.99,FR,windows,updateN ...
  • 情景進入 情境進入: 今天調試某查詢頁面,偶爾發現一個問題,剛剛插入的數據,沒有正常排序顯示,經過後臺調試sql,發現一個問題??? 經過上面紅色對比,不知道你發現問題沒,Order by 只是多一個欄位,順序居然不一樣,在我看來,是不是今天出門沒看黃曆,見鬼了,哈哈。。。。。 怎麼想也不明白了,後 ...
  • 談起刷LeetCode的心得,想要先扯點別的,說實話我是比較自虐的人,大學時候本專業從來不好好上,一直覬覦著別人的專業,因為自己文科生,總覺得沒有項技術在身出門找工作都沒有底氣,然後看什麼炫學什麼,簡直沒有目的和節操,覺得平面設計美就去狂記色號(當然不是 ,十六進位顏色碼這個名字太長我想簡稱色號), ...
  • 全球領先的企業商業智能(BI)軟體提供商Pyramid Analytics與微軟聯手,憑藉完善的分析平臺BI Office強化Power BI Desktop的個人生產力功能。新的“Publish to Pyramid Server”功能通過基於web的內部或私有雲平臺,允許用戶將報告和可視化內容發 ...
  • SQL Server中授予用戶查看對象定義的許可權 在SQL Server中,有時候需要給一些登錄名(用戶)授予查看所有或部分對象(存儲過程、函數、視圖、表)的定義許可權存。如果是部分存儲過程、函數、視圖授予查看定義的許可權,那麼就像下麵腳本所示,比較繁瑣: GRANT VIEW DEFINITION O... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...