PERMISSIONS (Transact-SQL)
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體
傳回包含點陣圖的值,表示目前使用者的陳述式、物件或資料行權限。
重要
SQL Server 的未來版本將移除此功能。 請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。 請改用 fn_my_permissions 和 Has_Perms_By_Name。 繼續使用 PERMISSIONS 函數可能會降低效能。
語法
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 | 刪除 |
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 函數
下列範例會決定目前使用者是否可將資料列插入 Address
資料庫的 AdventureWorks2022
資料表中。
IF PERMISSIONS(OBJECT_ID('AdventureWorks2022.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 函數
下列範例會決定目前使用者是否可授與 Address
資料庫中 AdventureWorks2022
資料表的 INSERT 權限給另一位使用者。
IF PERMISSIONS(OBJECT_ID('AdventureWorks2022.Person.Address','U'))&0x80000=0x80000
PRINT 'INSERT on Person.Address is grantable.'
ELSE
PRINT 'You may not GRANT INSERT permissions on Person.Address.';
另請參閱
DENY (Transact-SQL)
GRANT (Transact-SQL)
OBJECT_ID (Transact-SQL)
REVOKE (Transact-SQL)
sp_helprotect (Transact-SQL)
系統函數 (Transact-SQL)