投影ポリシー

このトピックでは、投影ポリシーを使用して、 SQL クエリ結果の出力で列の投影を許可または禁止する方法について説明します。

概要

投影ポリシーはファーストクラスのスキーマレベルオブジェクトで、 SQL クエリ結果の出力に列を投影できるかどうかを定義します。投影ポリシーが割り当てられている列は、 投影制約 と呼ばれます。投影ポリシーは、パートナー間で:doc:`安全にデータを共有する</user-guide/data-sharing-gs>`際に、機密情報や個人情報(名前や電話番号など)に制約を付与するために使用されます。

ただし、投影ポリシーによって隠された列であっても、内部クエリや WHERE 句では使用することができ、指定されたフィールドに関する情報を開示できることに注意してください。詳細については、このトピック内の 考慮事項 のセクションをご参照ください。

投影ポリシーを作成した後、ポリシー管理者は投影ポリシーを列に割り当てることができます。列には一度に1つの投影ポリシーのみを割り当てることができます。アクティブなロールが、列の投影を許可する投影ポリシー条件に一致する場合にのみ、ユーザーは列を投影できます。

投影制約列はマスキングポリシーでも保護でき、投影制約列を含むテーブルは行アクセスポリシーでも保護できることに注意してください。詳細については、 マスキングポリシーおよび行アクセスポリシー (このトピック内)をご参照ください。

投影ポリシーは、最終結果テーブルに表示される列のみに影響します。そのため、以下のクエリを実行するユーザーには、列 "protected_C "が投影を拒否した場合、 NULL が表示されます。

SELECT protected_C,                         -- NULL, in outer query
       my_func(protected_C),                -- Any functions on NULL returns NULL
       nonprotected_C
       FROM (SELECT protected_C,            -- Projection policies are ignored in a nested query.
                    nonprotected_C from T)
WHERE protected_C > 5;                      -- Not shown in results, so this works
Copy

列の使用状況

Snowflakeは列の使用状況を追跡します。列に投影ポリシーが設定されている場合、ビュー定義、 UDF (このトピック内)、共通テーブル式などの列への間接参照は、列の投影に影響を与えます。

列に投影ポリシーが設定されており、列を投影できない場合、列は次のようになります。

  • クエリ結果の出力には含まれません。

  • 別のテーブルに挿入することはできません。

  • 外部関数またはストアドプロシージャの引数にすることはできません。

制限事項

  • ユーザー定義関数(UDFs)に関する制限については、 ユーザー定義関数(UDFs) (このトピック内)をご参照ください。

  • 投影ポリシーを次に適用することはできません。

    • テーブルや列に割り当てられたタグ(つまり、タグベースの投影ポリシー)。

    • 仮想列、または外部テーブルの VALUE 列。回避策として、ビューを作成し、投影すべきでない各列に投影ポリシーを割り当てます。

    • PIVOT 構造の value_column。詳細については、 UNPIVOT (このトピック内)をご参照ください。

  • 投影ポリシー 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;
    
    Copy
  • 投影制約は、悪意のある攻撃者が意図的なクエリを使用して投影制約列から潜在的に機密性の高いデータを取得できないことを保証するものではありません。投影ポリシーは、既に一定の信頼関係があるパートナーや顧客との使用に最適です。さらに、プロバイダーはデータが悪用される可能性について警戒しておく必要があります(例: リストのアクセス履歴を確認する)。

  • まれに、投影制約のある列を含むクエリのエラー・メッセージに、その列の値が1つだけ含まれることがあります。

  • これらの理由から、特定の列やエンティティに関する漏洩を防ぐ必要がある場合は、データからその列を完全に省くか、 差分プライバシー を採用する必要があります。

投影ポリシーの作成

投影ポリシーには、 PROJECTION_CONSTRAINT 関数を呼び出して列を投影するかどうかを決定する body が含まれます。

CREATE OR REPLACE PROJECTION POLICY <name>
  AS () RETURNS PROJECTION_CONSTRAINT -> <body>
Copy

条件:

  • name はポリシーの名前を指定します。

  • AS () RETURNS PROJECTION_CONSTRAINT はポリシーの署名と戻り型です。署名は引数を受け入れず、戻り型は内部データ型である PROJECTION_CONSTRAINT です。すべての投影ポリシーは、同じ署名と戻り値の型を持ちます。

  • body は列を投影するかどうかを決定する SQL 式です。これには、 CASE およびその他の有効な SQL ステートメントを含めることができ、 TRUE または FALSE と評価される SELECT 句を含めることもできます。投影を許可しない場合は NULL を返さないでください。 指定された列の投影を許可するかどうか、およびその列をリクエストするクエリをどのように扱うかを指定する値を PROJECTION_CONSTRAINT 関数に返す必要があります。構文については CREATE PROJECTION POLICY を参照してください。

ポリシーの例

もっとも単純な投影ポリシーは、 PROJECTION_CONSTRAINT 関数を直接呼び出します。

列の投影を許可する
CREATE OR REPLACE PROJECTION POLICY mypolicy
AS () RETURNS PROJECTION_CONSTRAINT ->
PROJECTION_CONSTRAINT(ALLOW => true);
Copy
列の投影を許可しない
CREATE OR REPLACE PROJECTION POLICY mypolicy
AS () RETURNS PROJECTION_CONSTRAINT ->
PROJECTION_CONSTRAINT(ALLOW => false);
Copy
特定のロールに列が投影されないようにします。

より複雑な SQL 式を記述して、 PROJECTION_CONSTRAINT 関数を呼び出すことができます。式では、 条件式関数コンテキスト関数 を使用して、特定のロールを持つ特定のユーザーが列を投影できるようにし、他のすべてのユーザーが列を投影できないようにするロジックを導入できます。

Tip

条件付きポリシーでコンテキスト関数を使用する場合、次のストラテジーを使用できます。

  • コンテキスト関数は文字列を返すので、それを使った比較では大文字と小文字が区別されます。大文字小文字を区別せずに比較する場合は、 LOWER を使って文字列をすべて小文字に変換することができます。

  • POLICY_CONTEXT 関数は、コンテキスト関数が特定の値を返すときに、ポリシー本体が正しい値を返しているかどうかを評価するのに役立ちます。POLICY_CONTEXT関数は、1つ以上のコンテキスト関数の指定値に基づいてクエリ結果をシミュレートします。

次の例は、 CASE 式と CURRENT_ROLE コンテキスト関数を含み、 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;
Copy

次の例では、 analyst ロールを持つユーザーが列にアクセスできるようにしますが、それ以外のユーザーには、その列またはその列から派生する列の NULL 値のみが表示されます。

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, ENFORCEMENT => 'NULLIFY')
END;
Copy
投影ポリシーでタグを使用します。

次の例では、 SYSTEM$GET_TAG_ON_CURRENT_COLUMN 関数を使用して、列に割り当てられたタグによってその列を投影できるかどうかを決定します。この場合、ポリシーが列に割り当てられると、列を投影するために、その列の tags.accounting_col タグの値を public にする必要があります。

CREATE PROJECTION POLICY mypolicy
AS () RETURNS PROJECTION_CONSTRAINT ->
CASE
  WHEN SYSTEM$GET_TAG_ON_CURRENT_COLUMN('tags.accounting_col') = 'public'
    THEN PROJECTION_CONSTRAINT(ALLOW => true)
  ELSE PROJECTION_CONSTRAINT(ALLOW => false)
END;
Copy

データ共有のユースケースの場合、プロバイダーは、 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;
Copy
特定の共有への制限

セキュアビューの列に投影ポリシーが設定されている、データ共有プロバイダーアカウントについて考えます。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;
Copy
別のテーブルをクエリして投影ポリシーを判断する

ポリシーロジックで SELECT クエリを使用し、投影を許可するかブロックするかを判断できます。この方法でテーブル( マッピングテーブル) をクエリする場合は、保護されたテーブルと同じデータベースにマッピングテーブルを置くことをお勧めします。これは、 body セクションが IS_DATABASE_ROLE_IN_SESSION を呼び出す場合に特に重要です。

以下の長い例では、ロール名と投影許可の簡単なマッピングテーブルを作成し、入力を行ってから、そのテーブルにクエリを実行して、現在のユーザーへの列の投影を許可するかどうかを、ロールに従って判断します。

-- Create mapping table with two columns: role name, whether that role can project the column
CREATE OR REPLACE TABLE roles_with_access(role string, allowed boolean)
AS SELECT * FROM VALUES ('ACCOUNTADMIN', true), ('RANDOM_ROLE', false);

-- Create a policy that queries the mapping table, and allows projection when current
-- user role has an `allowed` value of TRUE.
-- Note that the logic is written to default to FALSE in all other cases, including the
-- current role not being in the queried table.
CREATE OR REPLACE PROJECTION POLICY pp AS () RETURNS projection_constraint ->
  CASE WHEN
    exists(
      SELECT 1 FROM roles_with_access WHERE role = current_role() AND allowed = true
    ) THEN projection_constraint(ALLOW=>true)
  ELSE projection_constraint(ALLOW=>false) END;

-- Create a new table with the policy and query it in one step.
CREATE OR REPLACE TABLE t(user string, address string WITH PROJECTION POLICY pp)
  AS SELECT * FROM VALUES ('Carson', 'CA'), ('Emily', 'NY'), ('John', 'NV');

-- Succeeds
USE ROLE ACCOUNTADMIN;
SELECT * FROM t;

-- Fails with projection policy error on column ADDRESS
USE ROLE any_other_role;
SELECT * FROM t;
Copy

投影ポリシーの割り当て

投影ポリシーは、 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 ] ... ]
Copy

条件:

  • 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;
Copy

CREATE TABLE および CREATE VIEW コマンドの WITH 句を使用して、テーブルまたはビューの作成時に列に投影ポリシーを割り当てることもできます。たとえば、新しいテーブルの account_number 列にポリシー my_proj_policy を割り当てるには、次を実行します。

CREATE TABLE t1 (account_number NUMBER WITH PROJECTION POLICY my_proj_policy);
Copy

既存のテーブルに新しい列を追加する場合にも、WITH句を使用できます。例えば、既存のテーブル customers に追加される zipcode 列にポリシー my_proj_policy を割り当てるには、次の操作を実行します。

ALTER TABLE customers ADD COLUMN account_number NUMBER WITH PROJECTION POLICY my_proj_policy;
Copy

投影ポリシーの置き換え

投影ポリシーの置き換えに推奨される方法として、 FORCE パラメーターを使用して既存の投影ポリシーをデタッチし、1つのコマンドで新しい投影ポリシーを割り当てます。この方法により、保護にギャップが残らないように、古いポリシーを自動的に置き換えることができます。

たとえば、すでに投影制約のある列に新しい投影ポリシーを割り当てる場合は、次のようにします。

ALTER TABLE finance.accounting.customers
  MODIFY COLUMN account_number
  SET PROJECTION POLICY proj_policy2 FORCE;
Copy

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 ... ]
Copy

条件:

  • name はテーブルまたはビューの名前を指定します。

  • col1_name は、テーブルまたはビュー内の列の名前を指定します。

  • col2_name は、テーブルまたはビューの追加列の名前を指定します。

たとえば、 account_number 列から投影ポリシーを削除するには、次のようにします。

ALTER TABLE finance.accounting.customers
 MODIFY COLUMN account_number
 UNSET PROJECTION POLICY;
Copy

Snowsight で投影ポリシーを表示します。

列が投影ポリシーを持っているかどうかを判断するには、以下のようにします。

  1. Snowsight にサインインします。

  2. ナビゲーションメニューで:ui:Catalog » :ui:`Database Explorer`を選択し、列を含むテーブルにナビゲートします。

  3. Columns タブを選択します。

  4. Policy 列を使用して、列にデータ ガバナンス ポリシーがあるかどうかを判断します。

  5. 各ポリシーにカーソルを合わせると、それが投影ポリシーかどうかを判断できます。

    投影ポリシーの場合、投影ポリシーによってクエリが実行されないか、または出力に NULL 値が返されるかを判断することもできます。ポリシーの本文が複雑で、異なる条件下で異なる動作をする場合、 Snowsight は、クエリが失敗したか、 NULL 値を返したかを単に表示する代わりに、本文の内容を表示します。

SQL を使用した投影ポリシーのモニター

投影ポリシーの使用状況をモニターする方法を決定するために、2つの一般的なアプローチを考えると役立つ場合があります。

投影ポリシーを見つける

共有 SNOWFLAKE データベースのAccount Usageスキーマで PROJECTION_POLICIES ビューを使用できます。このビューは、Snowflakeアカウント内にあるすべての投影ポリシーの カタログ です。例:

SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.PROJECTION_POLICIES
ORDER BY POLICY_NAME;
Copy

投影ポリシーの参照を特定する

POLICY_REFERENCES Information Schemaテーブル関数は、投影ポリシーの参照を識別できます。2つの異なる構文オプションがあります。

  1. 列に指定された投影ポリシーがセットされている各オブジェクト (つまり、テーブルまたは表示) の行を返します:

    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'));
    
    Copy
  2. 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'));
    
    Copy

拡張例

投影ポリシーの作成とその投影ポリシーの列への割り当ては、マスキングポリシーや行アクセスポリシーなどの他のポリシーを作成して割り当てる場合と同じ、一般的な手順に従います。

  1. 集中管理アプローチについては、ポリシーを管理するためのカスタムロール(例: proj_policy_admin)を作成します。

  2. このロールに、投影ポリシーを作成および割り当てる権限を付与します。

  3. 投影ポリシーを作成します。

  4. 投影ポリシーを列に割り当てます。

この一般的な手順に基づき、次の手順を実行して、列に投影ポリシーを割り当てます。

  1. 投影ポリシーを管理するカスタムロールを作成します。

    USE ROLE useradmin;
    
    CREATE ROLE proj_policy_admin;
    
    Copy
  2. スキーマに投影ポリシーを作成し、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;
    
    Copy

    詳細については、このトピックの 権限とコマンド をご参照ください。

  3. 列の投影を防止する投影ポリシーを作成します。

    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);
    
    Copy
  4. 投影ポリシーをテーブル列に割り当てます。

    ALTER TABLE customers MODIFY COLUMN active
    SET PROJECTION POLICY privacy.projpolicies.proj_policy_false;
    
    Copy

Snowflake機能を使用した投影ポリシー

以下のサブセクションでは、投影ポリシーがさまざまなSnowflake機能やサービスとどのように相互作用するかを簡単に説明します。

マスキングポリシーおよび行アクセスポリシー

このセクションでは、投影ポリシーが マスキングポリシー および 行アクセスポリシー とどのように相互作用するかを説明します。

複数のポリシー:

列はマスキングポリシーと投影ポリシーを同時に持つことができ、この列を含むテーブルは行アクセスポリシーで保護できます。3つのポリシーがすべて存在する場合、Snowflakeはテーブルとポリシーを次のように処理します。

  1. 行アクセスポリシーに従って行フィルターを適用します。

  2. クエリが、投影ポリシーによって制限されている列を投影しようとしているかどうかを判断し、投影しようとしている場合はクエリを拒否します。

  3. マスキングポリシーに従って列マスクを適用します。

マスキングポリシーで保護された列は、投影制約を受けることもできます。たとえば、口座番号を含む列に設定されたマスキングポリシーは、 finance_admin カスタムロールを持つユーザーに口座番号を表示することを許可する条件と、他のすべてのロールに対して口座番号をハッシュに置き換える条件を持つことができます。

投影ポリシーは、 analyst カスタムロールを持つユーザーが列を投影できないように、列をさらに制限できます。analyst カスタムロールを持つユーザーは、ハッシュをグループ化したり、これらのハッシュを結合したりすることで、列を分析できます。

Snowflakeでは、ポリシー管理者が社内のコンプライアンス担当者や規制担当者と協力して、投影を制限する列を決定することを推奨しています。

ポリシーの評価:

投影制約列は、次の場合、マスキングポリシーまたは行アクセスポリシーでは参照できません。

  • 行アクセスポリシーをテーブルに割り当てる。

  • 条件付きマスキングポリシー の1つ以上の列を列挙する。

  • マッピングテーブルの検索を実行する。

このトピック内の 制限事項 で述べたように、投影ポリシー body は、マスキングポリシーで保護された列や、行アクセスポリシーで保護されたテーブルを参照できません。

他の投影ポリシーの従属オブジェクト

次の一連のオブジェクトについて考えてみます。

base_table » v1 » v2

条件:

  • v1 は、 base_table という名前のテーブルから構築されたビューです。

  • v2v1 から作成されたビュー。

投影制約のあるビューの列に対するクエリがあり、その列が 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 権限が必要です。スキーマに対する任意の権限を付与されたロールは、そのロールがスキーマを解決することを可能にすることに注意してください。たとえば、スキーマに対するCREATE権限を付与されたロールは、そのスキーマにオブジェクトを作成できますが、そのスキーマに対するUSAGE*も*付与されている必要はありません。

権限

使用状況

APPLY

列の投影ポリシーの設定および設定解除操作を有効にします。

OWNERSHIP

投影ポリシーの所有権を譲渡し、投影ポリシーに対する完全な制御を許可します。投影ポリシーのほとんどのプロパティを変更するために必要です。

詳細については、このトピックの DDL コマンド、操作、および権限の概要 をご参照ください。

投影ポリシー DDL 参照

Snowflakeは、投影ポリシーを作成および管理するために次の DDL をサポートしています。

DDL コマンド、操作、および権限の概要

次のテーブルは、投影ポリシー権限と DDL 操作の関係をまとめたものです。

スキーマ内のオブジェクトに対して操作を実行するには、親データベースとスキーマに対する USAGE 権限が必要です。スキーマに対する任意の権限を付与されたロールは、そのロールがスキーマを解決することを可能にすることに注意してください。たとえば、スキーマに対するCREATE権限を付与されたロールは、そのスキーマにオブジェクトを作成できますが、そのスキーマに対するUSAGE*も*付与されている必要はありません。

操作

必要な権限

投影ポリシーを作成する。

同じスキーマ内の CREATE PROJECTION POLICY 権限を持つロール。

投影ポリシーを変更する。

投影ポリシーに対する OWNERSHIP 権限を持つロール。

投影ポリシーを説明する

次のいずれかを使用します。

  • グローバル APPLY PROJECTION POLICY 権限を持つロール。または

  • 投影ポリシーに対する OWNERSHIP 権限を持つロール。または

  • 投影ポリシーに対する APPLY 権限を持つロール。

投影ポリシーをドロップする。

投影ポリシーに対する OWNERSHIP 権限を持つロール。

投影ポリシーを表示する。

次のいずれかを使用します。

  • 投影ポリシーが存在するスキーマに対する USAGE 権限を持つロール。または

  • アカウントに対する APPLY PROJECTION POLICY を持つロール。

列の投影ポリシーを設定または設定解除する。

次のいずれかを使用します。

  • アカウントに対する APPLY PROJECTION POLICY 権限を持つロール。または

  • 投影ポリシーに対して APPLY 権限を持ち、テーブルまたはビューに対して OWNERSHIP 権限を持つロール。

Snowflakeは、オブジェクトに投影ポリシーを作成および設定するためのさまざまな権限をサポートしています。

  1. 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;
    
    Copy
  2. ハイブリッド型管理アプローチでは、単一のロールに 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;
    
    Copy