SQL Database では先行してプレビュー実装されていますが、SQL Server 2016 から Dynamic Data Masking が使用できるようになります。
有効にする方法が SQL Database とは違っているので軽くまとめてみたいと思います。
詳細については Dynamic Data Masking を参照してください。
おださんのブログも参考になります。
SQL Server 2016 CTP2 Dynamic Data Masking が構文エラーになる。。
SQL Server 2016 CTP2 Dynamic Data Masking の構文エラー回避方法
SQL Database v12 の場合はポータルや API 経由で有効にする必要がありましたが、SQL Server 2016 ではクエリベースで設定することができます。
現状は、設定時にトレースフラグの有効化が必要になるのでここが注意点かと。
# CTP 2.0 の場合の制約です。CTP 2.1 の場合はトレースフラグを有効にするとエラーとなってしまいます。
DBCC TRACEON(209,219,-1)
あとはサンプルのクエリを実行すれば準備は完了です。
実行プランとしては、「Compute Scalar」でマスクした値を返すというクエリになって実行されるようですね。
SQL Database の場合は、右の実行プランのように、動的データマスクを使用していても通常の実行プランとなるため、SQL Server 2016 と SQL Database ではユーザーから見える結果は同じですが、実装方法が微妙に異なっているのかもしれないですね。
マスクされるかされないかについては「UNMASK」の権限により制御が行われているようで、マスクしない状態でデータを取得したい場合には「GRANT UNMASK」でマスクしない状態でのデータ取得を許可する必要が出てきます。
GRANT UNMASK TO TestUser; DENY UNMASK TO TestUser; REVOKE UNMASK TO TestUser;
ただし、db_owner の権限をつけた場合、マスクをしない状態でデータを取得できるようですので、マスクをする場合には「DENY UNMASK」でマスクしない状態でのデータ取得を拒否したほうがよさそうです。
Permissions (Database Engine) で確認をしたところ、 「UNMASK」の範囲は DATABASE のようですので、ユーザーによって、どのテーブルのみマスクしてデータを取得させるというような細かな設定はできず、データベースで一律の設定となるようです。