Security5:授予權限

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)的權限。html

在SQL Server的安全模型中,安全主體主要分爲兩個級別:實例級別和數據庫級別,每個級別都須要一個與之對應的安全主體:Login是SQL Server實例級別的安全主體,用於登錄實例時的驗證,驗證方式分爲Windows驗證(經過Windows域帳戶驗證登錄權限)和SQL Server驗證(經過帳號和密碼驗證登錄權限),而User是數據庫級別的安全主體,用於訪問數據庫。Login和User能夠經過SID(安全標識)關聯起來,若是Login沒有關聯User,那麼Login只能經過Public角色去訪問數據庫;若是User沒有關聯Login,那麼該User是孤立用戶,只能經過模擬權限被使用。通常狀況下,一個User只能關聯一個Login。sql

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

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

  • 左側爲安全主體:安全主體(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:授予引用的權限,用於在當前表中引用其餘數據表主鍵的權限;
  • IMPERSONATE:模擬權限,模擬Login或User的權限
  • 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),語法以下:dom

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

對於Table,View等數據庫對象,能夠把權限控制在column的粒度上,只容許用戶訪問特定的數據列;若是在GRANT子句中忽略column,那麼用戶能夠訪問整個table或view的全部列。ide

把訪問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

相關文章
相關標籤/搜索