Column-Level セキュリティを使用すると、ユーザーの実行コンテキストまたはグループ メンバーシップに基づいてテーブル列へのアクセスを制御できます。
列レベルのセキュリティにより、アプリケーションのセキュリティの設計とコーディングが簡素化され、列アクセスを制限して機密データを保護できます。 たとえば、特定のユーザーが自分の部署に関連するテーブルの特定の列にのみアクセスできることを確認します。 アクセスの制限のロジックは、別のアプリケーション層のデータから離れてではなく、データベース層にあります。 データベースは、任意の層からデータ アクセスが試行されるたびにアクセス制限を適用します。 この制限により、セキュリティ システム全体の領域を減らすことで、セキュリティの信頼性と堅牢性が向上します。 さらに、列レベルのセキュリティにより、ユーザーにアクセス制限を課すために列を除外するビューを導入する必要がなくなります。
GRANT オブジェクト権限 T-SQL 構文を使用して、列レベルのセキュリティを実装できます。 このメカニズムでは、SQL 認証と Microsoft Entra ID (旧称 Azure Active Directory) 認証の両方がサポートされます。
また、WHERE
句フィルターに基づいて、テーブルに行レベルのセキュリティを適用する機能も検討してください。
構文
オブジェクト権限の GRANT
ステートメントの構文を使用すると、テーブル上のコンマ区切りの列リストにアクセス許可を付与できます。
GRANT <permission> [ ,...n ] ON
[ OBJECT :: ][ schema_name ]. object_name [ ( column [ ,...n ] ) ]
TO <database_principal> [ ,...n ]
[ WITH GRANT OPTION ]
[ AS <database_principal> ]
<permission> ::=
SELECT
| UPDATE
<database_principal> ::=
Database_user
| Database_role
| Database_user_mapped_to_Windows_User
| Database_user_mapped_to_Windows_Group
例示
次の例では、TestUser
が SSN
テーブルの Membership
列にアクセスするのを制限する方法を示します。
Membership
テーブルを作成し、SSN
列を社会保障番号を格納するために使用します。
CREATE TABLE Membership
(MemberID int IDENTITY,
FirstName varchar(100) NULL,
SSN char(9) NOT NULL,
LastName varchar(100) NOT NULL,
Phone varchar(12) NULL,
Email varchar(100) NULL);
機密データを含むSSN
列を除くすべての列へのアクセスをTestUser
に許可します。
GRANT SELECT ON Membership(MemberID, FirstName, LastName, Phone, Email) TO TestUser;
SSN
列が含まれている場合、TestUser
実行されたクエリは失敗します。
SELECT * FROM Membership;
結果として発生するエラー:
Msg 230, Level 14, State 1, Line 12
The SELECT permission was denied on the column 'SSN' of the object 'Membership', database 'CLS_TestDW', schema 'dbo'.
活用事例
列レベルのセキュリティが現在どのように使用されているかの例を次に示します。
- 金融サービス会社では、アカウント マネージャーのみが顧客の社会保障番号 (SSN)、電話番号、およびその他の個人データにアクセスできます。
- 医療提供者は、医師と看護師のみが機密の医療記録にアクセスでき、課金部門のメンバーがこのデータを表示できないようにします。