共用方式為


PERMISSIONS (Transact-SQL)

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

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

主題連結圖示Transact-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 函數

下列範例會決定目前使用者是否可將資料列插入 AdventureWorks2008R2 資料庫的 Address 資料表中。

IF PERMISSIONS(OBJECT_ID('AdventureWorks2008R2.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 函數

下列範例會決定目前使用者是否可授與 AdventureWorks2008R2 資料庫中 Address 資料表的 INSERT 權限給另一位使用者。

IF PERMISSIONS(OBJECT_ID('AdventureWorks2008R2.Person.Address','U'))&0x80000=0x80000
   PRINT 'INSERT on Person.Address is grantable.'
ELSE
   PRINT 'You may not GRANT INSERT permissions on Person.Address.';