PERMISSIONS (Transact-SQL)
現在のユーザーのステートメント権限、オブジェクト権限、または列権限を示すビットマップを含む値を返します。
重要 この機能は、将来のバージョンの Microsoft 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 関数をオブジェクト権限に対して用する
次の例では、現在のユーザーが 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.';