結構心待ちにしていた機能です。
これまでもダイナミックビューで同様のことは実現できていましたが、テーブルに対するビューを定義するので若干取り回しが大変だったのですが、テーブルにフィルターをアタッチする形になるのでフィルターの再利用もしやすくなります。
こちらでは行フィルター(row filter)を試します。
準備
事前にDS
というグループを作成しておき、ユーザーAのみを追加しておきます。
対象のテーブルはtarget
とします。以下のようにpickup_zip
などの郵便番号が含まれているテーブルです。ちなみにこちらはNYのタクシーの乗降記録です。
Sharedクラスターを作成して起動します。シングルユーザークラスターでは本機能は動作しません。
ユーザーAの作業
USE main.default;
行フィルターの関数を定義します。このフィルターは、テーブルにアクセスするユーザーがグループDS
に所属している場合には前レコードを返却しますが、そうではない場合にはzipコードが10153
のレコードのみを返却します。
CREATE FUNCTION zip_filter(zip STRING)
RETURN IF(IS_ACCOUNT_GROUP_MEMBER('DS'), true, zip='10153');
テーブルにフィルターを適用します。
ALTER TABLE target SET ROW FILTER zip_filter ON (pickup_zip);
なお、フィルター適用されているかどうかを確認するにはテーブルにDESCRIBE EXTENDED
を実行します。
DESCRIBE EXTENDED target;
Row filter
にどのテーブルのどの列にどのフィルターが適用されているのかが表示されます。
テーブルtarget
にクエリーを発行するとすべてのレコードが返却されます。
ユーザーBの作業
ユーザーBはグループDS
には属していません。
SELECT * FROM target;
行フィルターが動作して、pickup_zip
が10153
のレコードしか返却されなくなっています。
次は列マスク(column mask)を試してみます。