投影ポリシー¶
このトピックでは、投影ポリシーを使用して、 SQL クエリ結果の出力で列の投影を許可または禁止する方法について説明します。
概要¶
投影ポリシーはファーストクラスのスキーマレベルオブジェクトで、 SQL クエリ結果の出力に列を投影できるかどうかを定義します。投影ポリシーが割り当てられている列は、 投影制約 と呼ばれます。
投影ポリシーは、 データを安全に共有する 際に、オブジェクトの識別子列(名前や電話番号など)を制約するために使用できます。たとえば、ソリューションパートナーとしての協力を希望している2つの企業が、統合ソリューションの開発に先立って、共通の顧客を特定するとします。プロバイダーは、コンシューマーが機密情報を識別できるようにするために必要な共有内の識別子列に投影ポリシーを割り当てることができます。共有データを使用して、コンシューマーはソリューションに必要な事前に合意された列に基づいて照合を実行できますが、それらの列から値を返すことはできません。
この例で投影ポリシーを使用する利点には、次が含まれます。
特定の値を表示できるようにすることなく、コンシューマーは特定の値に基づいて記録を照合できます。
SQL クエリ結果に機密性の高いプロバイダー情報を出力することはできません。詳細については、このトピック内の 考慮事項 のセクションをご参照ください。
投影ポリシーを作成した後、ポリシー管理者は投影ポリシーを列に割り当てることができます。列には一度に1つの投影ポリシーのみを割り当てることができます。アクティブなロールが、列の投影を許可する投影ポリシー条件に一致する場合にのみ、ユーザーは列を投影できます。
投影制約列はマスキングポリシーでも保護でき、投影制約列を含むテーブルは行アクセスポリシーでも保護できることに注意してください。詳細については、 マスキングポリシーおよび行アクセスポリシー (このトピック内)をご参照ください。
列の使用状況¶
Snowflakeは列の使用状況を追跡します。列に投影ポリシーが設定されている場合、ビュー定義、 UDF (このトピック内)、共通テーブル式などの列への間接参照は、列の投影に影響を与えます。
列に投影ポリシーが設定されており、列を投影できない場合、列は次のようになります。
クエリ結果の出力には含まれません。
別のテーブルに挿入することはできません。
外部関数またはストアドプロシージャの引数にすることはできません。
制限事項¶
- UDFs:
ユーザー定義関数(UDFs)に関する制限については、 ユーザー定義関数(UDFs) (このトピック内)をご参照ください。
- ポリシー:
投影ポリシーを次に適用することはできません。
タグ。そのタグをテーブルまたは列に割り当てることはできません(つまり、「タグベースの投影ポリシー」)。
仮想列、または外部テーブルの VALUE 列。
回避策として、ビューを作成し、投影すべきでない各列に投影ポリシーを割り当てます。
投影ポリシー
body
は、マスキングポリシーで保護された列または行アクセスポリシーで保護されたテーブルを参照できません。追加の詳細については、 マスキングポリシーおよび行アクセスポリシー (このトピック内)をご参照ください。
考慮事項¶
機密性の高い列をクエリするユースケースで、列の値をアナリストや同様の役割の人に直接公開する必要がない場合に投影ポリシーを使用します。投影制約列内の列値は、マスクされた値やトークン化された値よりも高い柔軟性で分析できます。ただし、列に投影ポリシーを設定する前に、次の点を考慮してください。
投影ポリシーは、個人の標的化を妨げるものではありません。
たとえば、ユーザーは、列が投影制約されている場合でも、
name
列が特定の個人に対応する行をフィルターできます。ただし、ユーザーは SELECT ステートメントを実行してテーブル内の個人の名前を表示することはできません。投影制約列が、保護されたテーブルのデータと保護されていないテーブルのデータを組み合わせるクエリの結合キーである場合、ユーザーが保護されていないテーブルの列から値を投影することを妨げるものは何もありません。その結果、保護されていないテーブルの値が保護された列の値と一致する場合、ユーザーは保護されていないテーブルからその値を投影することで取得できます。
たとえば、
t_protected
テーブルのemail
列に投影ポリシーが割り当てられたとします。ユーザーは、次のコマンドを実行することで、t_protected.email
列の値を確認できます。SELECT t_unprotected.email FROM t_unprotected JOIN t_protected ON t_unprotected.email = t_protected.email;
投影制約は、悪意のある攻撃者が意図的なクエリを使用して投影制約列から潜在的に機密性の高いデータを取得できないことを保証するものではありません。投影ポリシーは、すでに信頼関係が構築されているパートナーや顧客との使用に最適です。さらに、プロバイダーはデータが悪用される可能性について警戒しておく必要があります(例: リストのアクセス履歴を確認する)。
投影ポリシーの作成¶
投影ポリシーには、内部 PROJECTION_CONSTRAINT 関数を呼び出して列を投影するかどうかを決定する body
が含まれています。
CREATE OR REPLACE PROJECTION POLICY <name> AS () RETURNS PROJECTION_CONSTRAINT -> <body>条件:
name
はポリシーの名前を指定します。
AS () RETURNS PROJECTION_CONSTRAINT
はポリシーの署名と戻り型です。署名は引数を受け入れず、戻り型は内部データ型である PROJECTION_CONSTRAINT です。すべての投影ポリシーは、同じ署名と戻り値の型を持ちます。
body
は、列を投影するかどうかを決定する SQL 式です。この式は、内部の PROJECTION_CONSTRAINT 関数を呼び出して、列の投影を許可または禁止します。
PROJECTION_CONSTRAINT(ALLOW => true)
で、列を投影できます。
PROJECTION_CONSTRAINT(ALLOW => false)
では、列の投影は許可されません。
ポリシーの例¶
もっとも単純な投影ポリシーは、 PROJECTION_CONSTRAINT 関数を直接呼び出します。
- 列の投影を許可する
CREATE OR REPLACE PROJECTION POLICY mypolicy AS () RETURNS PROJECTION_CONSTRAINT -> PROJECTION_CONSTRAINT(ALLOW => true)
- 列の投影を許可しない
CREATE OR REPLACE PROJECTION POLICY mypolicy AS () RETURNS PROJECTION_CONSTRAINT -> PROJECTION_CONSTRAINT(ALLOW => false)
より複雑な SQL 式を記述して、 PROJECTION_CONSTRAINT 関数を呼び出すことができます。式では、 条件式関数 と コンテキスト関数 を使用して、特定のロールを持つ特定のユーザーが列を投影できるようにし、他のすべてのユーザーが列を投影できないようにするロジックを導入できます。
たとえば、 CASE 式を使用して、 analyst
カスタムロールを持つユーザのみが列を投影できるようにします。
CREATE OR REPLACE PROJECTION POLICY mypolicy AS () RETURNS PROJECTION_CONSTRAINT -> CASE WHEN CURRENT_ROLE() = 'ANALYST' THEN PROJECTION_CONSTRAINT(ALLOW => true) ELSE PROJECTION_CONSTRAINT(ALLOW => false) END;
データ共有のユースケースの場合、プロバイダーは、 CURRENT_ACCOUNT コンテキスト関数を使用して、すべてのコンシューマーアカウントの列の投影を制約する投影ポリシーを記述することができます。また、 INVOKER_SHARE コンテキスト関数を使用して、特定の共有で列の投影を選択的に制限することもできます。例:
- すべてのコンシューマーアカウントを制限する
この例では、
provider.account
はアカウント名形式の アカウント識別子 です。CREATE OR REPLACE PROJECTION POLICY restrict_consumer_accounts AS () RETURNS PROJECTION_CONSTRAINT -> CASE WHEN CURRENT_ACCOUNT() = 'provider.account' THEN PROJECTION_CONSTRAINT(ALLOW => true) ELSE PROJECTION_CONSTRAINT(ALLOW => false) END;
- 特定の共有への制限
セキュアビューの列に投影ポリシーが設定されている、データ共有プロバイダーアカウントについて考えます。2つの異なるデータ共有コンシューマーをサポートするセキュアビューにアクセスできる、2つの異なる共有(
SHARE1
およびSHARE2
)があります。データ共有コンシューマーアカウントのユーザーがいずれかの共有を介して列を投影しようとすると、列を投影できますが、それ以外の場合は列を投影できません。
CREATE OR REPLACE PROJECTION POLICY projection_share AS () RETURNS PROJECTION_CONSTRAINT -> CASE WHEN INVOKER_SHARE() IN ('SHARE1', 'SHARE2') THEN PROJECTION_CONSTRAINT(ALLOW => true) ELSE PROJECTION_CONSTRAINT(ALLOW => false) END;
投影ポリシーの割り当て¶
投影ポリシーは、 ALTER TABLE ... ALTER COLUMN コマンドを使用してテーブル列に適用され、 ALTER VIEW コマンドを使用してビュー列に適用されます。各列は 1 つの投影ポリシーのみをサポートします。
ALTER { TABLE | VIEW } <name> { ALTER | MODIFY } COLUMN <col1_name> SET PROJECTION POLICY <policy_name> [ FORCE ] [ , <col2_name> SET PROJECTION POLICY <policy_name> [ FORCE ] ... ]
条件:
name
はテーブルまたはビューの名前を指定します。col1_name
は、テーブルまたはビュー内の列の名前を指定します。col2_name
は、テーブルまたはビューの追加列の名前を指定します。policy_name
は、列に設定された投影ポリシーの名前を指定します。FORCE
はオプションのパラメーターであり、すでに投影ポリシーが割り当てられている列にコマンドで投影ポリシーを割り当てることができます。新しい投影ポリシーは、既存の投影ポリシーをアトミックに置き換えます。
たとえば、テーブルの account_number
列に投影ポリシー proj_policy_acctnumber
を設定します。
ALTER TABLE finance.accounting.customers MODIFY COLUMN account_number SET PROJECTION POLICY proj_policy_acctnumber;
CREATE TABLE および CREATE VIEW コマンドの WITH 句を使用して、テーブルまたはビューの作成時に列に投影ポリシーを割り当てることもできます。たとえば、新しいテーブルの account_number
列にポリシー my_proj_policy
を割り当てるには、次を実行します。
CREATE TABLE t1 (account_number NUMBER WITH PROJECTION POLICY my_proj_policy);
投影ポリシーの置き換え¶
投影ポリシーの置き換えに推奨される方法として、 FORCE
パラメーターを使用して既存の投影ポリシーをデタッチし、1つのコマンドで新しい投影ポリシーを割り当てます。この方法により、保護にギャップが残らないように、古いポリシーを自動的に置き換えることができます。
たとえば、すでに投影制約のある列に新しい投影ポリシーを割り当てる場合は、次のようにします。
ALTER TABLE finance.accounting.customers
MODIFY COLUMN account_number
SET PROJECTION POLICY proj_policy2 FORCE;
1つのステートメントで列から投影ポリシーをデタッチし、(... UNSET PROJECTION POLICY)、別のステートメントで列に新しいポリシーを設定することもできます(... SET PROJECTION POLICY <name>)。この方法を選択した場合、あるポリシーをデタッチして別のポリシーを割り当てるまでの間、列は投影ポリシーによって保護されません。この間にクエリが機密データにアクセスする可能性があります。
投影ポリシーのデタッチ¶
ALTER TABLE または ALTER VIEW コマンドの UNSET PROJECTION POLICY 句を使用して、テーブルまたはビューの列から投影ポリシーをデタッチします。列には複数の投影ポリシーを付けることはできないため、投影ポリシーの名前は必須ではありません。
ALTER { TABLE | VIEW } <name> { ALTER | MODIFY } COLUMN <col1_name> UNSET PROJECTION POLICY [ , <col2_name> UNSET PROJECTION POLICY ... ]
条件:
name
はテーブルまたはビューの名前を指定します。col1_name
は、テーブルまたはビュー内の列の名前を指定します。col2_name
は、テーブルまたはビューの追加列の名前を指定します。
たとえば、 account_number
列から投影ポリシーを削除するには、次のようにします。
ALTER TABLE finance.accounting.customers MODIFY COLUMN account_number UNSET PROJECTION POLICY;
SQL を使用した投影ポリシーのモニター¶
投影ポリシーの使用状況をモニターする方法を決定するために、2つの一般的なアプローチを考えると役立つ場合があります。
投影ポリシーを見つける¶
共有 SNOWFLAKE データベースのAccount Usageスキーマで PROJECTION_POLICIES ビューを使用できます。このビューは、Snowflakeアカウント内にあるすべての投影ポリシーの カタログ です。例:
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.PROJECTION_POLICIES ORDER BY POLICY_NAME;
投影ポリシーの参照を特定する¶
POLICY_REFERENCES Information Schemaテーブル関数は、投影ポリシーの参照を識別できます。2つの異なる構文オプションがあります。
指定された投影ポリシーが列に設定されている各オブジェクト(テーブルまたはビュー)の行を返します。
USE DATABASE my_db; SELECT policy_name, policy_kind, ref_entity_name, ref_entity_domain, ref_column_name, ref_arg_column_names, policy_status FROM TABLE(information_schema.policy_references(policy_name => 'my_db.my_schema.projpolicy'));
my_table
という名前のテーブルに割り当てられた各ポリシーの行を返します。USE DATABASE my_db; USE SCHEMA information_schema; SELECT policy_name, policy_kind, ref_entity_name, ref_entity_domain, ref_column_name, ref_arg_column_names, policy_status FROM TABLE(information_schema.policy_references(ref_entity_name => 'my_db.my_schema.my_table', ref_entity_domain => 'table'));
拡張例¶
投影ポリシーの作成とその投影ポリシーの列への割り当ては、マスキングポリシーや行アクセスポリシーなどの他のポリシーを作成して割り当てる場合と同じ、一般的な手順に従います。
集中管理アプローチについては、ポリシーを管理するためのカスタムロール(例:
proj_policy_admin
)を作成します。このロールに、投影ポリシーを作成および割り当てる権限を付与します。
投影ポリシーを作成します。
投影ポリシーを列に割り当てます。
この一般的な手順に基づき、次の手順を実行して、列に投影ポリシーを割り当てます。
投影ポリシーを管理するカスタムロールを作成します。
USE ROLE useradmin; CREATE ROLE proj_policy_admin;
スキーマに投影ポリシーを作成し、Snowflakeアカウントのテーブルまたはビュー列に投影ポリシーを割り当てる権限を
proj_policy_admin
カスタムロールに付与します。このステップでは、投影ポリシーが
privacy.projpolicies
という名前のデータベースとスキーマに保存され、このデータベースとスキーマがすでに存在していることを前提としています。GRANT USAGE ON DATABASE privacy TO ROLE proj_policy_admin; GRANT USAGE ON SCHEMA privacy.projpolicies TO ROLE proj_policy_admin; GRANT CREATE PROJECTION POLICY ON SCHEMA privacy.projpolicies TO ROLE proj_policy_admin; GRANT APPLY PROJECTION POLICY ON ACCOUNT TO ROLE proj_policy_admin;
詳細については、このトピックの 権限とコマンド をご参照ください。
列の投影を防止する投影ポリシーを作成します。
USE ROLE proj_policy_admin; USE SCHEMA privacy.projpolicies; CREATE OR REPLACE PROJECTION POLICY proj_policy_false AS () RETURNS PROJECTION_CONSTRAINT -> PROJECTION_CONSTRAINT(ALLOW => false);
投影ポリシーをテーブル列に割り当てます。
ALTER TABLE customers MODIFY COLUMN active SET PROJECTION POLICY privacy.projpolicies.proj_policy_false;
Snowflake機能を使用した投影ポリシー¶
以下のサブセクションでは、投影ポリシーがさまざまなSnowflake機能やサービスとどのように相互作用するかを簡単に説明します。
マスキングポリシーおよび行アクセスポリシー¶
このセクションでは、投影ポリシーが マスキングポリシー および 行アクセスポリシー とどのように相互作用するかを説明します。
- 複数のポリシー:
列はマスキングポリシーと投影ポリシーを同時に持つことができ、この列を含むテーブルは行アクセスポリシーで保護できます。3つのポリシーがすべて存在する場合、Snowflakeはテーブルとポリシーを次のように処理します。
行アクセスポリシーに従って行フィルターを適用します。
クエリが、投影ポリシーによって制限されている列を投影しようとしているかどうかを判断し、投影しようとしている場合はクエリを拒否します。
マスキングポリシーに従って列マスクを適用します。
マスキングポリシーで保護された列は、投影制約を受けることもできます。たとえば、口座番号を含む列に設定されたマスキングポリシーは、
finance_admin
カスタムロールを持つユーザーに口座番号を表示することを許可する条件と、他のすべてのロールに対して口座番号をハッシュに置き換える条件を持つことができます。投影ポリシーは、
analyst
カスタムロールを持つユーザーが列を投影できないように、列をさらに制限できます。analyst
カスタムロールを持つユーザーは、ハッシュをグループ化したり、これらのハッシュを結合したりすることで、列を分析できます。Snowflakeでは、ポリシー管理者が社内のコンプライアンス担当者や規制担当者と協力して、投影を制限する列を決定することを推奨しています。
- ポリシーの評価:
投影制約列は、次の場合、マスキングポリシーまたは行アクセスポリシーでは参照できません。
行アクセスポリシーをテーブルに割り当てる。
条件付きマスキングポリシー の1つ以上の列を列挙する。
マッピングテーブルの検索を実行する。
このトピック内の 制限事項 で述べたように、投影ポリシー
body
は、マスキングポリシーで保護された列や、行アクセスポリシーで保護されたテーブルを参照できません。
他の投影ポリシーの従属オブジェクト¶
次の一連のオブジェクトについて考えてみます。
base_table
»v1
»v2
条件:
v1
は、base_table
という名前のテーブルから構築されたビューです。
v2
はv1
から作成されたビュー。
投影制約のあるビューの列に対するクエリがあり、その列が base_table
の投影制約のある列に依存している場合、 両方 の投影ポリシーがその列の投影を許可している場合にのみ、ビューの列が投影されます。
Snowflakeは、列への参照が投影制約を受けていないことを確認するために、ベーステーブルまですべての列の系統チェーンをチェックします。系統チェーン内のいずれかの列が投影制約を受け、その列が投影を許可されていない場合、Snowflakeはクエリをブロックします。
ビューおよびマテリアライズドビュー¶
ビュー列に対する投影ポリシーは、ビュー列を制約するものであり、ベーステーブル列を制約するものではありません。
参照に関しては、テーブル列を制約する投影ポリシーは、制約されたテーブル列を参照するビューにも引き継がれます。
ストリームおよびタスク¶
テーブルの列の投影ポリシーは、同じテーブルのストリームに引き継がれます。投影ポリシーをストリームに設定することはできません。
同様に、タスクが制約された列を参照しても、投影制約された列は制約されたままです。
UNPIVOT¶
UNPIVOT 構成の結果は、列が最初に投影ポリシーによって制約されたかどうかに依存します。注意:
UNPIVOT を実行する前も後も、制約された列は投影制約されたままです。
クエリ結果には常に
name_column
が表示されます。column_list
の列が投影制約を受けている場合、value_column
も投影制約を受けます。
クローンされたオブジェクト¶
次のアプローチは、クローンされたデータベースまたはスキーマに格納されているクローンされたテーブルまたはビューの SELECT 権限を持つユーザーからデータを保護するのに役立ちます。
個別の投影ポリシーオブジェクトのクローニングはサポートされていません。
スキーマのクローニングにより、スキーマ内のすべての投影ポリシーがクローニングされます。
クローンされたテーブルは、ソーステーブルと同じ投影ポリシーにマップされます。
テーブルがその親スキーマクローニングのコンテキストでクローンされるときに、同じ親スキーマの投影ポリシーへの参照(つまり、ローカル参照)がソーステーブルにあると、クローンされたテーブルはクローンされたポリシーへの参照を持つようになります。
ソーステーブルが別のスキーマの投影ポリシー(つまり、外部参照)を参照している場合、クローンされたテーブルは外部参照を保持します。
詳細については、 CREATE <オブジェクト> ... CLONE をご参照ください。
複製¶
投影ポリシーとその割り当ては、データベース複製と複製グループを使用して複製することができます。
データベース複製 の場合は、次のいずれかの条件に該当すると、複製操作に失敗します。
プライマリデータベースはEnterprise(またはそれ以上)のアカウントにあり、ポリシーを含んでいるが、下位エディションには、複製の承認されたアカウントが1つ以上ある。
プライマリデータベースに含まれるテーブルまたはビューには、別のデータベースにある投影ポリシーへの ダングリングリファレンス がある。
複製グループ で複数のデータベースを複製すると、データベース複製のダングリングリファレンス動作を回避できます。
ユーザー定義関数(UDFs)¶
投影制約と UDFs に関して、次のことに注意してください。
- スカラー SQL UDFs:
Snowflake は UDF を評価し、投影制約のある列に投影ポリシーを適用します。
SELECT ステートメント内の列が、投影制約列から派生する UDF ステートメントから派生する場合、Snowflakeはクエリをブロックします。つまり、次のようになります。
pc_column
» UDF » 列( SELECT ステートメント内)条件:
pc_column
は投影制約のある列を指します。
SELECT ステートメント内の列は投影制約列にトレースできるため、Snowflakeはクエリをブロックします。
- SQL UDTFs:
SQL ユーザー定義テーブル関数(UDTF)は SQL UDFs と同じ動作に従いますが、関数の出力で行が返されるため、Snowflakeは各テーブルの列を個別に評価して、関数の出力に列を投影するかどうかを決定します。
- その他の UDFs:
次は、 Java UDFs の紹介、 JavaScript UDFs の紹介、 Python UDFsの紹介 に適用されます。
投影制約列は、 UDTF 出力で制約されます。
- ログおよびイベントテーブル:
UDF、 UDTF、または JavaScript UDF に投影制約引数がある場合、Snowflakeは対応するイベントテーブルにログとイベントの詳細を取り込みません。ただし、Snowflakeは UDF/UDTF の実行を許可し、 UDF/UDTF を呼び出すステートメントをログの理由で失敗させません。
権限とコマンド¶
次のサブセクションでは、投影ポリシーの管理に役立つ情報を提供します。
投影ポリシーの権限¶
Snowflakeは、投影ポリシーオブジェクトで次の権限をサポートしています。
スキーマ内の任意のオブジェクトを操作するには、親データベースとスキーマに対する USAGE 権限も必要であることに注意してください。
権限 |
使用状況 |
---|---|
APPLY |
列の投影ポリシーの設定および設定解除操作を有効にします。 |
OWNERSHIP |
投影ポリシーの所有権を譲渡し、投影ポリシーに対する完全な制御を許可します。投影ポリシーのほとんどのプロパティを変更するために必要です。 |
詳細については、このトピックの DDL コマンド、操作、および権限の概要 をご参照ください。
投影ポリシー DDL 参照¶
Snowflakeは、投影ポリシーを作成および管理するために次の DDL をサポートしています。
DDL コマンド、操作、および権限の概要¶
次のテーブルは、投影ポリシー権限と DDL 操作の関係をまとめたものです。
スキーマ内の任意のオブジェクトを操作するには、親データベースとスキーマに対する USAGE 権限も必要であることに注意してください。
操作 |
必要な権限 |
---|---|
投影ポリシーを作成する。 |
同じスキーマ内の CREATE PROJECTION POLICY 権限を持つロール。 |
投影ポリシーを変更する。 |
投影ポリシーに対する OWNERSHIP 権限を持つロール。 |
投影ポリシーを説明する |
次のいずれかを使用します。
|
投影ポリシーをドロップする。 |
投影ポリシーに対する OWNERSHIP 権限を持つロール。 |
投影ポリシーを表示する。 |
次のいずれかを使用します。
|
列の投影ポリシーを設定または設定解除する。 |
次のいずれかを使用します。
|
Snowflakeは、オブジェクトに投影ポリシーを作成および設定するためのさまざまな権限をサポートしています。
projection_policy_admin
カスタムロールが すべての 列に投影ポリシーを作成および設定する集中型の投影ポリシー管理アプローチの場合は、次の権限が必要です。USE ROLE securityadmin; GRANT USAGE ON DATABASE mydb TO ROLE projection_policy_admin; GRANT USAGE ON SCHEMA mydb.schema TO ROLE projection_policy_admin; GRANT CREATE PROJECTION POLICY ON SCHEMA mydb.schema TO ROLE projection_policy_admin; GRANT APPLY ON PROJECTION POLICY ON ACCOUNT TO ROLE projection_policy_admin;
ハイブリッド型管理アプローチでは、単一のロールに CREATE PROJECTION POLICY 権限があり、集計ポリシーに一貫した名前が付けられ、個別のチームまたはロールに特定の投影ポリシーの APPLY 権限があります。
たとえば、カスタムロール
finance_role
ロールには、ロールが所有するテーブルおよびビューに投影ポリシーcost_center
を設定する権限を付与します(つまり、ロールにはテーブルまたはビューの OWNERSHIP 権限があります)。USE ROLE securityadmin; GRANT CREATE PROJECTION POLICY ON SCHEMA mydb.schema TO ROLE projection_policy_admin; GRANT APPLY ON PROJECTION POLICY cost_center TO ROLE finance_role;