共用方式為


PERMISSIONS (Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫 Azure SQL 受控執行個體

傳回包含點陣圖的值,表示目前使用者的陳述式、物件或資料行權限。

重要

SQL Server 的未來版本將移除此功能。 請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。 請改用 fn_my_permissionsHas_Perms_By_Name。 繼續使用 PERMISSIONS 函數可能會降低效能。

Transact-SQL 語法慣例

Syntax

PERMISSIONS ( [ objectid [ , 'column' ] ] )  

注意

若要檢視 SQL Server 2014 (12.x) 和更早版本的 Transact-SQL 語法,請參閱舊版文件

引數

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)