HAS_PERMS_BY_NAME (Transact-SQL)

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

トピック リンク アイコン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 です。

    注意注意

    SQL Server の SQL Server 2008 Service Pack 2 までのバージョンでは、sub-securables に '[sub name]' の形式で角かっこを使用することはできません。代わりに 'sub name' を使用してください。

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

戻り値の型

int

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

説明

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

  • プリンシパルに直接許可されており、拒否されていない権限。

  • プリンシパルが保持する上位レベルの権限に暗黙的に含まれており、拒否されていない権限。

  • プリンシパルがメンバとなっているロールまたはグループに許可されており、拒否されていない権限。

  • プリンシパルがメンバとなっているロールまたはグループが保持しており、拒否されていない権限。

権限の評価は、常に呼び出し元のセキュリティ コンテキストで実行されます。ユーザーに有効な権限があるかどうかを評価するには、呼び出し元に、そのユーザーに対する 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
(QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(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');