次の方法で共有


許可(Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric の SQL データベース

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

重要

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

Transact-SQL 構文表記規則

構文

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

引数

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 プロシージャを作成
8 0x8 ビューを作成
16 0x10 ルールを作成
32 0x20 デフォルトを作成する
64 0x40 データベースをバックアップ
128 0x80 バックアップ ログ
256 0x100 予約済み

次の表は、objectid だけを指定したときに返される、オブジェクト権限に使用されるビットです。

ビット (10 進) ビット (16 進) ステートメント権限
1 0x1 すべて選択
2 0x2 全て更新
4 0x4 参考文献
8 0x8 INSERT
16 0x10 DELETE
32 0x20 EXECUTE (プロシージャのみ)
4096 0x1000 SELECT ANY (少なくとも 1 列)
8192 0x2000 アップデートしてください
16384 0x4000 参考文献

次の表は、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 データベース内の AdventureWorks2025 テーブルにデータ行を挿入できるかどうかを判定します。

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 データベース内の AdventureWorks2025 テーブルに対する 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.';  

参照

拒否 (Transact-SQL)
グラント (Transact-SQL)
OBJECT_ID(Transact-SQL)
取り消し (Transact-SQL)
sp_helprotect(Transact-SQL)
システム関数 (Transact-SQL)