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
SQL Server的安全模型是有層次結構的,對安全對象的權限存在繼承關係,對父安全對象上設置的權限,會自動繼承到子安全對象上,例如,擁有架構(Schema)的CONTROL權限,這意味着,對該架構下的全部的數據庫對象都用於CONTROL權限。安全
一般狀況下,權限的管理都是針對數據庫對象(Table,View,SP,Schema等)的,數據庫對象的主要權限以下列表所示:服務器
用戶能夠經過表值函數: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,而後把角色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
在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;
通常狀況下,對於特殊的管理任務,須要建立孤立用戶,給孤立用戶授予特定的權限,並把模擬孤立用戶的權限授予其餘用戶,這些人就有權限執行特定的管理任務。
參考文檔:
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