HAS_PERMS_BY_NAME (Transact-SQL)

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

セキュリティ保護可能なリソースに対して現在のユーザーが持つ有効な権限を評価します。 関連する関数は fn_my_permissions です。

Transact-SQL 構文表記規則

構文

HAS_PERMS_BY_NAME ( securable , securable_class , permission    
    [ , sub-securable ] [ , sub-securable_class ] )  

Note

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

引数

securable
セキュリティ保護可能なリソースの名前を指定します。 セキュリティ保護可能なリソースがサーバー自体の場合、この値は NULL に設定する必要があります。 securable には sysname 型のスカラー式を指定します。 既定値はありません。

securable_class
権限のテスト対象とするセキュリティ保護可能なリソースのクラスの名前を指定します。 securable_class には nvarchar(60) 型のスカラー式を指定します。

Azure SQL データベース において、securable_class 引数は、DATABASEOBJECTROLESCHEMAUSER のうちのいずれか 1 つに設定する必要があります。

permission
チェックする権限名を表す、NULL 以外の sysname 型のスカラー式を指定します。 既定値はありません。 権限名 ANY はワイルドカードです。

sub-securable
権限をチェックするセキュリティ保護可能なサブエンティティの名前を表す、sysname 型のスカラー式を指定します (省略可能)。 既定値は NULL です。

注意

sub-securables に '[sub name]' の形式で角かっこを使用することはできません。 代わりに 'sub name' を使用してください。

sub-securable_class
権限をチェックするセキュリティ保護可能なサブエンティティのクラスを表す、nvarchar(60) 型のスカラー式を指定します (省略可能)。 既定値は NULL です。

Azure SQL データベース では、sub-securable_class 引数は、securable_class 引数が OBJECT に設定されている場合にのみ有効です。 securable_class 引数が OBJECT に設定されている場合、sub-securable_class 引数は COLUMN に設定する必要があります。

戻り値の型

int

クエリが失敗した場合は NULL が返されます。

解説

この組み込み関数では、現在のプリンシパルが、指定したセキュリティ保護可能なリソースに対して、特定の有効な権限を保持しているかどうかが評価されます。 HAS_PERMS_BY_NAME は、セキュリティ保護可能なリソースに対する有効な権限がユーザーにある場合は 1 を返し、有効な権限がない場合は 0 を返します。また、セキュリティ保護可能なクラスまたは権限が無効である場合は 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 権限を保持しているかどうかをチェックする

適用対象: SQL Server 2008 (10.0.x) 以降

SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE');  

B. サーバー プリンシパル Ps に対する IMPERSONATE 権限を保持しているかどうかをチェックする

適用対象: SQL Server 2008 (10.0.x) 以降

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 内にプロシージャとテーブルを作成できるかどうかをチェックする

次の例では、ALTERS 権限、データベースに 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  
(QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name),   
    'OBJECT', 'SELECT') AS have_select, * FROM sys.tables  

G. AdventureWorks2022 の SalesPerson テーブルに対して、INSERT 権限を保持しているかどうかをチェックする

次の例では、AdventureWorks2022 が自分の現在のデータベース コンテキストであると想定し、2 部構成の名前を使用します。

SELECT HAS_PERMS_BY_NAME('Sales.SalesPerson', 'OBJECT', 'INSERT');  

次の例では、現在のデータベース コンテキストに関する想定はなく、3 部構成の名前を使用します。

SELECT HAS_PERMS_BY_NAME('AdventureWorks2022.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)