PERMISSIONS (Transact-SQL)
傳回包含點陣圖的值,表示目前使用者的陳述式、物件或資料行權限。
重要事項 未來的 Microsoft SQL Server 版本將移除這項功能。請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。:請改用 fn_my_permissions 和 Has_Perms_By_Name。 繼續使用 PERMISSIONS 函數可能會降低效能。
適用於:SQL Server (SQL Server 2008 透過目前版本)、Windows Azure SQL 資料庫 (初始版本,透過目前版本)。 |
語法
PERMISSIONS ( [ objectid [ , 'column' ] ] )
引數
objectid
這是安全性實體的識別碼。 如果未指定 objectid,點陣圖值包含目前使用者的陳述式權限;否則,點陣圖包含目前使用者安全性實體的權限。 指定的安全性實體必須存在於目前資料庫中。 使用 OBJECT_ID 函數來決定 objectid 值。' column '
這是要傳回權限資訊之資料行的選擇性名稱。 資料行必須是 objectid 指定的資料表中有效的資料行名稱。
傳回類型
int
備註
PERMISSIONS 可用來決定目前使用者是否有必要的權限,來執行陳述式或將權限授與 (GRANT) 另一位使用者。
傳回的權限資訊是 32 位元點陣圖。
較低 16 位元反映出授與使用者的權限,以及套用至 Windows 群組的權限,和目前使用者是成員的固定伺服器角色。 例如,若未指定 objectid,傳回值 66 (十六進位值 0x42) 表示使用者有權限執行 CREATE TABLE (十進位值 2) 和 BACKUP DATABASE (十進位值 64) 陳述式。
較高 16 位元反映使用者可授與 (GRANT) 其他使用者的權限。 除了移位至左邊 16 位元 (乘以 65536) 之外,較高 16 位元與下表所描述之較低 16 位元的解譯方式完全一樣。 例如,指定 objectid 時,0x8 (十進位值 8) 就是表示 INSERT 權限的位元。 而 0x80000 (十進位值 524288) 表示 GRANT INSERT 權限的能力,因為 524288 = 8 x 65536。
因為角色的成員資格,沒有權限執行陳述式的使用者仍可授與該權限給另一位使用者。
下表顯示用於陳述式權限的位元 (未指定 objectid)。
位元 (dec) |
位元 (hex) |
陳述式權限 |
---|---|---|
1 |
0x1 |
CREATE DATABASE (僅限 master 資料庫) |
2 |
0x2 |
CREATE TABLE |
4 |
0x4 |
CREATE PROCEDURE |
8 |
0x8 |
CREATE VIEW |
16 |
0x10 |
CREATE RULE |
32 |
0x20 |
CREATE DEFAULT |
64 |
0x40 |
BACKUP DATABASE |
128 |
0x80 |
BACKUP LOG |
256 |
0x100 |
已保留 |
下表顯示的位元用於只在指定 objectid 時傳回的物件權限。
位元 (dec) |
位元 (hex) |
陳述式權限 |
---|---|---|
1 |
0x1 |
SELECT ALL |
2 |
0x2 |
UPDATE ALL |
4 |
0x4 |
REFERENCES ALL |
8 |
0x8 |
INSERT |
16 |
0x10 |
DELETE |
32 |
0x20 |
EXECUTE (僅限程序) |
4096 |
0x1000 |
SELECT ANY (至少一個資料行) |
8192 |
0x2000 |
UPDATE ANY |
16384 |
0x4000 |
REFERENCES ANY |
下表顯示的位元是用於同時指定 objectid 和資料行時傳回的資料行層級物件權限。
位元 (dec) |
位元 (hex) |
陳述式權限 |
---|---|---|
1 |
0x1 |
SELECT |
2 |
0x2 |
UPDATE |
4 |
0x4 |
REFERENCES |
當指定的參數為 NULL 或無效時,會傳回 NULL (例如,objectid 或不存在的資料行)。 不套用權限的位元值 (例如,用於資料表的 EXECUTE 權限 bit 0x20) 尚未定義。
使用位元 AND (&) 運算子,來決定 PERMISSIONS 函數傳回的點陣圖中設定的每一個位元。
sp_helprotect 系統預存程序也用來傳回目前資料庫中使用者的權限清單。
範例
A.搭配陳述式權限來使用 PERMISSIONS 函數
下列範例會決定目前使用者是否可執行 CREATE TABLE 陳述式。
IF PERMISSIONS()&2=2
CREATE TABLE test_table (col1 INT)
ELSE
PRINT 'ERROR: The current user cannot create a table.';
B.搭配物件權限來使用 PERMISSIONS 函數
下列範例會決定目前使用者是否可將資料列插入 AdventureWorks2012 資料庫的 Address 資料表中。
IF PERMISSIONS(OBJECT_ID('AdventureWorks2012.Person.Address','U'))&8=8
PRINT 'The current user can insert data into Person.Address.'
ELSE
PRINT 'ERROR: The current user cannot insert data into Person.Address.';
C.搭配可授與的權限來使用 PERMISSIONS 函數
下列範例會決定目前使用者是否可授與 AdventureWorks2012 資料庫中 Address 資料表的 INSERT 權限給另一位使用者。
IF PERMISSIONS(OBJECT_ID('AdventureWorks2012.Person.Address','U'))&0x80000=0x80000
PRINT 'INSERT on Person.Address is grantable.'
ELSE
PRINT 'You may not GRANT INSERT permissions on Person.Address.';