SQL Server における行レベルのアクセス許可の付与 (ADO.NET)

更新 : November 2007

権限を単に付与、取り消し、拒否するよりも細かなレベルでアクセスを制御したい場合があります。たとえば、医療施設のデータベース アプリケーションで、患者の情報が単一のテーブルに保存されているとします。この場合、患者の情報は、その担当医師以外は閲覧できないようにする必要があります。同様のシナリオは、金融機関、司法機関、政府機関、軍事機関のアプリケーションなど、さまざまな環境で考えられます。しかし、SQL Server では、行レベルでのセキュリティの実装はサポートされていません。別途、行のフィルタ選択メカニズムを定義する列をテーブルに作成する必要があります。

行レベルの権限の実装

行レベルの権限は、情報を単一のテーブルに保存するアプリケーションで使用します。それぞれの行は、ユーザー名、ラベル、識別子など、その行を特徴付けるパラメータを定義する列を持ちます。したがって、パラメータ化されたストアド プロシージャを作成し、適切な値を渡すことにより、指定された値に一致する行だけをユーザーに見せることができます。

次の手順は、ユーザー名またはログイン名に基づいて行レベルの権限を構成する方法を示しています。

  • テーブルを作成し、名前を保存するための列を追加します。

  • WHERE 句の条件にユーザー名列を使用してビューを作成します。これにより、指定された値に該当する行だけが返されます。データベースのユーザー名またはログイン名は、組み込み関数を使って指定するようにします。こうすることでユーザーごとに異なるビューを作成する手間を省くことができます。

    ' Returns the login identification name of the user.
    WHERE UserName = SUSER_SNAME()

    ' USER_NAME or CURRENT_USER Return the database user name.
    WHERE UserName = CURRENT_USER()
  • ベース テーブルではなくビューに基づいてデータを選択、挿入、更新、および削除するストアド プロシージャを作成します。ビューは、変更される行または返される行を制限するフィルタの役割を果たします。

  • データの挿入を行うストアド プロシージャの場合、ビューの WHERE 句と同じ関数を使用してユーザー名を取得し、その値を UserName 列に挿入します。

  • テーブルおよびビューに設定されている public ロールの権限をすべて拒否します。WHERE 句の条件には、ロールではなくユーザー名またはログイン名が使用されているため、ユーザーは、他のデータベース ロールから権限を継承することはできなくなります。

  • データベース ロールにストアド プロシージャの EXECUTE 権限を付与します。ユーザーは、提供されているストアド プロシージャを使ってのみ、データにアクセスできるようになります。

外部リソース

詳細については、次のリソースを参照してください。

SQL Server 2005 を使用して機密データベースに行レベルとセル レベルのセキュリティを実装する方法 (SQL Server TechCenter サイト)

行レベルとセル レベルのセキュリティを使用して、機密データベースのセキュリティ要件を満たす方法について説明します。

参照

概念

SQL Server におけるアプリケーション セキュリティのシナリオ (ADO.NET)

SQL Server でのストアド プロシージャを使用したアクセス許可の管理 (ADO.NET)

SQL Server での安全な動的 SQL の作成 (ADO.NET)

その他の技術情報

ADO.NET アプリケーションのセキュリティ保護

SQL Server セキュリティの概要 (ADO.NET)