PERMISSIONS (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

現在のユーザーのステートメント権限、オブジェクト権限、または列権限を示すビットマップを含む値を返します。

重要

この機能は、 SQL Serverの将来のバージョンで削除される予定です。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。 代わりに、fn_my_permissions および Has_Perms_By_Name を使用してください。 PERMISSIONS 関数を継続して使用すると、パフォーマンスが低下する場合があります。

Transact-SQL 構文表記規則

構文

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

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

objectid
セキュリティ保護可能なリソースの ID を指定します。 objectid を指定しない場合、ビットマップ値には現在のユーザーのステートメント権限が含まれます。それ以外の場合、ビットマップ値には現在のユーザーのセキュリティ保護可能なリソースについての権限が含まれます。 指定したセキュリティ保護可能なリソースは、現在のデータベースに存在する必要があります。 objectid 値を確認するには、OBJECT_ID 関数を使用します。

'column'
権限情報を返す列の名前を指定します (省略可能)。 objectid で指定したテーブル内の有効な列名を指定する必要があります。

戻り値の型

int

解説

PERMISSIONS は、現在のユーザーがステートメントを実行するのに必要な権限を所有しているか、または別のユーザーに対して権限を許可 (GRANT) できるかを調べるときに使用できます。

返される権限情報は 32 ビットのビットマップです。

下位 16 ビットは、ユーザーに許可されている権限と、現在のユーザーがメンバーである Windows グループまたは固定サーバー ロールに適用されている権限を表します。 たとえば、objectid を指定せず、戻り値 66 (16 進値の 0x42) が返された場合は、ユーザーが CREATE TABLE ステートメント (10 進値の 2) と BACKUP DATABASE ステートメント (10 進値の 64) を実行する権限を所有していることがわかります。

上位 16 ビットは、ユーザーが他のユーザーに許可 (GRANT) できる権限を表します。 上位 16 ビットの解釈は、次の表の下位 16 ビットを左側に 16 ビット移す (65,536 を乗算する) だけです。 たとえば、objectid を指定した場合、0x8 (10 進値の 8) は INSERT 権限を表すビットです。 これに対して、0x80000 (10 進値の 524288) は、524288 = 8 × 65536 であり、INSERT 権限を許可 (GRANT) できることを表します。

ロールのメンバーシップにより、ステートメントの実行権限のないユーザーでも、他のユーザーに権限を許可できる場合があります。

次の表は、objectid を指定しない場合の、ステートメント権限に使用されるビットです。

ビット (10 進) ビット (16 進) ステートメント権限
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 だけを指定したときに返される、オブジェクト権限に使用されるビットです。

ビット (10 進) ビット (16 進) ステートメント権限
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 (少なくとも 1 列)
8192 0x2000 UPDATE ANY
16384 0x4000 REFERENCES ANY

次の表は、objectid と column の両方を指定したときに返される、列レベルのオブジェクト権限に使用されるビットです。

ビット (10 進) ビット (16 進) ステートメント権限
1 0x1 SELECT
2 0x2 UPDATE
4 0x4 REFERENCES

指定したパラメーターが NULL の場合や無効な場合 (存在しない objectid や column が指定されている場合など) は、NULL が返されます。 適用されない権限 (テーブルに対するビット 0x20 の EXECUTE 権限など) のビット値は定義されていません。

PERMISSIONS 関数で返すビットマップ内の各ビットを指定するには、ビットごとの AND 演算子 (&) を使用します。

現在のデータベース内のユーザーに与えられている権限の一覧を返すには、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)