Has_Perms_By_Name (Transact-SQL)
セキュリティ保護可能なリソースに対して現在のユーザーが持つ有効な権限を評価します。
構文
Has_perms_by_name (
securable ,
securable_class ,
permission
[ , sub-securable ]
[ , sub-securable_class ]
)
引数
- securable
セキュリティ保護可能なリソースの名前を指定します。セキュリティ保護可能なリソースがサーバー自身の場合、この値は NULL に設定する必要があります。securable には sysname 型のスカラ式を指定します。既定値はありません。
- securable_class
権限を評価するセキュリティ保護可能なリソースのクラスの名前を指定します。securable_class には nvarchar(60) 型のスカラ式を指定します。
- permission
チェックする権限名を表す、NULL 以外の sysname 型のスカラ式を指定します。既定値はありません。権限名 ANY はワイルドカードとして扱われます。
- sub-securable
権限をチェックするセキュリティ保護可能なサブエンティティの名前を表す、sysname 型のスカラ式を指定します (省略可能)。既定値は NULL です。
- sub-securable_class
権限をチェックするセキュリティ保護可能なサブエンティティのクラスを表す、nvarchar(60) 型のスカラ式を指定します (省略可能)。既定値は NULL です。
戻り値の型
int
クエリが失敗した場合は NULL が返されます。
解説
この組み込み関数では、現在のプリンシパルが、指定したセキュリティ保護可能なリソースに対して、特定の有効な権限を保持しているかどうかが評価されます。有効な権限とは、次のような権限です。
- プリンシパルに直接許可されており、拒否されていない権限。
- プリンシパルが保持する上位レベルの権限に暗黙的に含まれており、拒否されていない権限。
- プリンシパルがメンバとなっているロールまたはグループに許可されており、拒否されていない権限。
- プリンシパルがメンバとなっているロールまたはグループが保持しており、拒否されていない権限。
権限の評価は、常に呼び出し元のセキュリティ コンテキストで実行されます。ユーザーに有効な権限があるかどうかを評価するには、呼び出し元に、そのユーザーに対する IMPERSONATE 権限が必要です。
スキーマ レベルのエンティティの場合、1 部、2 部、または 3 部構成の、NULL でない名前を使用できます。データベース レベルのエンティティの場合、1 部構成の名前を使用できます。NULL 値は "現在のデータベース" を示します。リソースがサーバー自身の場合は、"現在のサーバー" を表す NULL 値を使用する必要があります。この関数では、リンク サーバーに対する権限や、サーバー レベルのプリンシパルが作成されていない Windows ユーザーの権限をチェックできません。
次のクエリでは、セキュリティ保護可能な組み込みクラスの一覧が返されます。
SELECT class_desc FROM sys.fn_builtin_permissions(default)
次の照合順序が使用されます。
- 現在のデータベースの照合順序 : データベース レベルのセキュリティ保護可能なリソース (スキーマに含まれていないセキュリティ保護可能なリソースを含む)、スキーマ スコープの 1 部または 2 部構成のセキュリティ保護可能なリソース、3 部構成の名前を使用する場合は対象のデータベース。
- master データベースの照合順序 : サーバー レベルのセキュリティ保護可能なリソース。
- 列レベルのチェックの場合、"ANY" はサポートされません。適切な権限を指定する必要があります。
例
A. サーバー レベルの VIEW SERVER STATE 権限を保持しているかどうかをチェックする
SELECT has_perms_by_name(null, null, 'VIEW SERVER STATE');
B. サーバー プリンシパル Ps に対する IMPERSONATE 権限を保持しているかどうかをチェックする
SELECT has_perms_by_name('Ps', 'LOGIN', 'IMPERSONATE')
C. 現在のデータベースに対して権限を保持しているかどうかをチェックする
SELECT has_perms_by_name(db_name(), 'DATABASE', 'ANY')
D. 現在のデータベースに、データベース プリンシパル Pd の権限があるかどうかをチェックする
呼び出し元は、プリンシパル Pd
に対する IMPERSONATE 権限を保持していることを前提としています。
EXECUTE AS user = 'Pd'
GO
SELECT has_perms_by_name(db_name(), 'DATABASE', 'ANY')
GO
REVERT
GO
E. スキーマ S 内にプロシージャとテーブルを作成できるかどうかをチェックする
次の例では、S
に ALTER
権限、データベースに CREATE PROCEDURE
権限、およびテーブルに同様の権限が必要です。
SELECT has_perms_by_name(db_name(), 'DATABASE', 'CREATE PROCEDURE')
& has_perms_by_name('S', 'SCHEMA', 'ALTER') AS _can_create_procs,
has_perms_by_name(db_name(), 'DATABASE', 'CREATE TABLE') &
has_perms_by_name('S', 'SCHEMA', 'ALTER') AS _can_create_tables;
F. どのテーブルに対して、SELECT 権限を保持しているかをチェックする
SELECT has_perms_by_name(SCHEMA_NAME(schema_id) + '.' + name,
'OBJECT', 'SELECT') AS have_select, * FROM sys.tables;
G. AdventureWorks の SalesPerson に対して、INSERT 権限を保持しているかどうかをチェックする
次の例では、AdventureWorks
が自分の現在のデータベース コンテキストであると想定し、2 部構成の名前を使用します。
SELECT has_perms_by_name('Sales.SalesPerson', 'OBJECT', 'INSERT')
次の例では、現在のデータベース コンテキストに関する想定はなく、3 部構成の名前を使用します。
SELECT has_perms_by_name('AdventureWorks.Sales.SalesPerson',
'OBJECT', 'INSERT')
H. テーブル T のどの列に対して、SELECT 権限を保持しているかをチェックする
SELECT name AS column_name,
has_perms_by_name('T', 'OBJECT', 'SELECT', name, 'COLUMN')
AS can_select FROM sys.columns AS c
WHERE c.object_id=object_id('T');
参照
関連項目
sys.fn_builtin_permissions (Transact-SQL)
セキュリティ カタログ ビュー (Transact-SQL)