SQL Database では現状、プレビューではありますが、行単位にアクセス制御を行うための行レベルセキュリティ (RLS)を利用することができます。
海外の SQL Server Security Blog で RLS について興味深い投稿がありましたのでメモとして。
Row-Level Security: Blocking unauthorized INSERTs
Row-Level Security: Performance and common patterns
細かな内容は えろす師匠 に聞くとよいかと思います。
最初の情報は、RLS の INSERT の制御になります。
RLS では、SELECT / UPDATE / DELETE のような条件の指定が可能なものについてはフィルターをすることができますが、INSERT についてはフィルターをすることができません。
INSERT の制御については、制約やトリガーを用いる必要があるのですがそのための方法について記載されています。
チェック制約の中で関数を呼び、その関数の中で述語関数を呼ぶことで、INSERT の制御をしているようですね。
2 つ目の情報は RLS のパフォーマンスとなります。
RLS ではインデックスの利用も考慮されているため、パフォーマンスを意識するとインデックスについても考慮が必要となってきます。
RLS が設定されていない状態では以下のような実行プランとなります。
単純に RLS を設定すると以下のようにフィルターが行われます。
非クラスターかインデックスが設定されている場合、設定状況によっては以下のように Missing Index の情報が出力されることがあります。
また、インデックスの設定状況によっては、RLS が有効になっていても以下のようにフィルターがされずに検索が行われることもありますので、RLS を使用する場合はインデックスの設定状況も意識したほうがよさそうですね。