PERMISSIONS (Transact-SQL)
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance
現在のユーザーのステートメント権限、オブジェクト権限、または列権限を示すビットマップを含む値を返します。
重要
この機能は、 SQL Serverの将来のバージョンで削除される予定です。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。 代わりに、fn_my_permissions および Has_Perms_By_Name を使用してください。 PERMISSIONS 関数を継続して使用すると、パフォーマンスが低下する場合があります。
構文
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 | 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)