共用方式為


PERMISSIONS (Transact-SQL)

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

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

主題連結圖示 Transact-SQL 語法慣例

適用於: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.';

請參閱

參考

DENY (Transact-SQL)

GRANT (Transact-SQL)

OBJECT_ID (Transact-SQL)

REVOKE (Transact-SQL)

sp_helprotect (Transact-SQL)

系統函數 (Transact-SQL)