在安全系統中創建項目,使當前數據庫中的用戶得以處理當前數據庫中的數據或執行特定的 Transact-SQL 語句。
語句權限:
GRANT { ALL | statement [ ,...n ] } TO security_account [ ,...n ]
對象權限:
GRANT
{ ALL [ PRIVILEGES ] | permission [ ,...n ] }
{
}
[ ( column [ ,...n ] ) ] ON { table | vIEw
| ON { table | vIEw
} [ ( column [ ,...n ] ) ]
}
| ON { stored_procedure | extended_procedure
| ON { user_defined_function
}
}
}
TO security_account [ ,...n ]
[ WITH GRANT OPTION ]
[ AS { group | role ]
ALL
表示授予所有可用的權限。對於語句權限,只有 sysadmin 角色成員可以使用 ALL。對於對象權限,sysadmin 和 db_owner 角色成員和數據庫對象所有者都可以使用 ALL。
statement
是被授予權限的語句。語句列表可以包括:
n
一個占位符,表示此項可在逗號分隔的列表中重復。
TO
指定安全帳戶列表。
security_account
是權限將應用的安全帳戶。安全帳戶可以是:
當權限被授予一個 SQL Server 用戶或 Windows NT 用戶帳戶,指定的 security_account 是權限能影響到的唯一帳戶。若權限被授予 SQL Server 角色或 Windows NT 組,權限可影響到當前數據庫中該組或該角色成員的所有用戶。若組或角色和它們的成員之間存在權限沖突,最嚴格的權限 (DENY) 優先起作用。security_account 必須在當前數據庫中存在;不可將權限授予其它數據庫中的用戶、角色或組,除非已為該用戶在當前數據庫中創建或給予了訪問權限。
兩個特殊的安全帳戶可用於 GRANT 語句。授予 public 角色的權限可應用於數據庫中的所有用戶。授予 guest 用戶的權限可為所有在數據庫中沒有用戶帳戶的用戶使用。
當授予某個 Windows NT 本地組或全局組權限時,請指定在其上定義該組的域名或計算機名,然後依次輸入反斜線和組名。但是,若要授予訪問 Windows NT 內置本地組的權限,請指定 BUILTIN 而不是域名或計算機名。
PRIVILEGES
是可以包含在符合 SQL-92 標准的語句中的可選關鍵字。
permission
是當前授予的對象權限。當在表、表值函數或視圖上授予對象權限時,權限列表可以包括這些權限中的一個或多個:SELECT、INSERT、DELETE、REFENENCES 或 UPDATE。列列表可以與 SELECT 和 UPDATE 權限一起提供。如果列列表未與 SELECT 和 UPDATE 權限一起提供,那麼該權限應用於表、視圖或表值函數中的所有列。
在存儲過程上授予的對象權限只可以包括 EXECUTE。在標量值函數上授予的對象權限可以包括 EXECUTE 和 REFERENCES。
為在 SELECT 語句中訪問某個列,該列上需要有 SELECT 權限。為使用 UPDATE 語句更新某個列,該列上需要有 UPDATE 權限。
為創建引用某個表的 FOREIGN KEY 約束,該表上需要有 REFERENCES 權限。
為使用引用某個對象的 WITH SCHEMABINDING 子句創建 FUNCTION 或 VIEW,該對象上需要有 REFERENCES 權限。
column
是當前數據庫中授予權限的列名。
table
是當前數據庫中授予權限的表名。
vIEw
是當前數據庫中被授予權限的視圖名。
stored_procedure
是當前數據庫中授予權限的存儲過程名。
extended_procedure
是當前數據庫中授予權限的擴展存儲過程名。
user_defined_function
是當前數據庫中授予權限的用戶定義函數名。
WITH GRANT OPTION
表示給予了 security_account 將指定的對象權限授予其它安全帳戶的能力。WITH GRANT OPTION 子句僅對對象權限有效。
AS {group | role}
指當前數據庫中有執行 GRANT 語句權力的安全帳戶的可選名。當對象上的權限被授予一個組或角色時使用 AS,對象權限需要進一步授予不是組或角色的成員的用戶。因為只有用戶(而不是組或角色)可執行 GRANT 語句,組或角色的特定成員授予組或角色權力之下的對象的權限。
不允許有跨數據庫權限;只能將當前數據庫中的對象和語句的權限授予當前數據庫中的用戶。如果用戶需要另一個數據庫中的對象的權限,請在該數據庫中創建用戶帳戶,或者授權用戶帳戶訪問該數據庫以及當前數據庫。
說明 系統存儲過程是例外,因為 EXECUTE 權限已經授予 public 角色,允許任何人去執行。但是在執行系統存儲過程後,將檢查用戶的角色成員資格。如果此用戶不是運行此存儲過程所需要的適當的固定服務器或數據庫角色的成員,則此存儲過程不會繼續執行。
REVOKE 語句可用於刪除已授予的權限,DENY 語句可用於防止用戶通過 GRANT 語句獲得權限給他們的用戶帳戶。
授予權限刪除所授予級別(用戶、組或角色)上的已拒絕權限或已廢除權限。在另一級別(諸如包含此用戶的組或角色)上被拒絕的同一權限優先起作用。但是,雖然在另一級別上所廢除的同一權限仍然適用,但它並不阻止用戶訪問該對象。
如果用戶激活應用程序角色,對此用戶通過該應用程序角色訪問的任何對象,GRANT 的作用為空。因此,盡管一個用戶可能被授予了對當前數據庫中的指定對象的訪問權限,但是如果此用戶使用對此對象無訪問權限的應用程序角色,則在應用程序角色激活期間,此用戶也沒有此對象的訪問權限。
sp_helprotect 系統存儲過程報告在數據庫對象或用戶上的權限。
GRANT 權限依賴於所授予的語句權限和權限中涉及的對象。sysadmin 角色中的成員可在任何數據庫中授予任何權限。對象所有者可為他們所擁有的對象授予權限。db_owner 或 db_securityadmin 角色的成員可授予其數據庫中任何語句或對象上的任何權限。
需要權限的語句是那些在數據庫中增加對象,或對數據庫執行管理活動的語句。每條需要權限的語句都有一個特定的角色集,自動有權限執行此語句。例如,sysadmin、db_owner 和 db_ddladmin 角色的成員默認有CREATE TABLE 權限。sysadmin 和 db_owner 角色以及表的所有者默認有對表執行 SELECT 語句的權限。
有一些 Transact-SQL 語句不能被授予權限;執行這些語句要求有固定角色中的成員資格,此角色有默示執行特殊語句的權限。例如,若要執行 SHUTDOWN 語句,用戶必須添加為 serveradmin 角色中的成員。
dbcreator、processadmin、securityadmin 和 serveradmin 固定服務器角色的成員僅有權執行以下 Transact-SQL 語句。
(1) 有關更多信息,請參見 DBCC 語句。
(2) 僅適用於 CREATE DATABASE 語句。
說明 diskadmin 和 setupadmin 固定服務器角色的成員沒有權限執行任何 Transact-SQL 語句,他們只能執行特定的系統存儲過程。但是,sysadmin 固定服務器角色的成員有權限執行所有的 Transact-SQL 語句。
下面的固定數據庫角色的成員有權限執行指定的 Transact-SQL 語句。
X CREATE FUNCTION X X CREATE INDEX X (1) X CREATE PROCEDURE X X CREATE RULE X X CREATE TABLE X X CREATE TRIGGER
X (1) X CREATE VIEW X X
DBCC X X (2) DELETE X (1) X DENY X X DENY on object X DROP X (1) X EXECUTE X (1) GRANT X X GRANT on object X (1)INSERT X (1) X READTEXT X (1) X REFERENCES X (1) X RESTORE X REVOKE X X REVOKE on object X (1) SELECT X (1) X
valign="top"> SETUSER X TRUNCATE TABLE X (1) X UPDATE X (1) X UPDATE STATISTICS X (1) UPDATETEXT X (1) X WRITETEXT X (1) X
(1) 權限也適用於對象所有者。
(2) 有關更多信息,請參見 DBCC 語句。
說明 db_Accessadmin 固定數據庫角色的成員沒有執行任何 Transact-SQL 語句的權限,只可執行特定的系統存儲過程。
不需要權限即可執行的 Transact-SQL 語句有(已自動授予 public):
BEGIN TRANSACTION COMMIT TRANSACTION PRINT RAISERROR ROLLBACK TRANSACTION SAVE TRANSACTION SET
有關執行系統存儲過程所需權限的更多信息,請參見相應的系統存儲過程。
下面的示例給用戶 Mary 和 John 以及 Windows NT 組 Corporate\BobJ 授予多個語句權限。
GRANT CREATE DATABASE, CREATE TABLETO Mary, John, [Corporate\BobJ]
下例顯示權限的優先順序。首先,給 public 角色授予 SELECT 權限。然後,將特定的權限授予用戶 Mary、John 和 Tom。於是這些用戶就有了對 authors 表的所有權限。
USE pubsGOGRANT SELECTON authorsTO publicGO GRANT INSERT, UPDATE, DELETEON authorsTO Mary, John, TomGO
下面的示例將 CREATE TABLE 權限授予 Accounting 角色的所有成員。
GRANT CREATE TABLE TO Accounting
用戶 Jean 擁有表 Plan_Data。Jean 將表 Plan_Data 的 SELECT 權限授予 Accounting 角色(指定 WITH GRANT OPTION 子句)。用戶 Jill 是 Accounting 的成員,他要將表 Plan_Data 上的 SELECT 權限授予用戶 Jack,Jack 不是 Accounting 的成員。
因為對表 Plan_Data 用 GRANT 語句授予其他用戶 SELECT 權限的權限是授予 Accounting 角色而不是顯式地授予 Jill,不能因為已授予 Accounting 角色中成員該權限,而使 Jill 能夠授予表的權限。
Jill 必須用 AS 子句來獲得 Accounting 角色的授予權限。/* User Jean */GRANT SELECT ON Plan_Data TO Accounting WITH GRANT OPTION/* User Jill */GRANT SELECT ON Plan_Data TO Jack AS Accounting
授予權限
DENY
REVOKE
sp_addgroup
sp_addlogin
sp_adduser
sp_changegroup
sp_changedbowner
sp_dropgroup
sp_dropuser
sp_helpgroup
sp_helprotect
sp_helpuser