セキュアオブジェクト: エラーメッセージの情報の編集(保留中)

セキュアオブジェクトに関連するエラーメッセージは以下のように動作します。

変更前:

セキュアオブジェクトに関連するエラーメッセージには、メッセージの全文が表示されます。

変更後:

セキュリティオブジェクトに関連するエラーメッセージは、編集される可能性があります。

この変更は、以下のタイプのオブジェクトに関するエラーメッセージに適用されます。

セキュリティオブジェクトの詳細については、 セキュアオブジェクトを使用したデータアクセスの制御を使用する をご参照ください。

セキュアオブジェクトの展開または評価中にエラーが検出された場合、エラーメッセージは編集の対象となります。エラーメッセージが編集されても、エラーコードは変更されません。

エラーメッセージの変更には、実行中の編集と実行後のメタデータでの編集の2つのタイプがあります。これらのタイプの変更については、以下のセクションで説明します。

実行中の編集

エラーメッセージ全体、またはエラーメッセージの一部を、操作中にエラーが返されたときに編集することができます。一般的に、このタイプのエラーメッセージの編集は、ユーザーがセキュアオブジェクトの OWNERSHIP 権限を持たずにセキュアオブジェクトを使用しようとしたときに発生します。

実行後のメタデータの編集

ユーザーはエラー発生後、エラーメッセージを含むエラーに関するメタデータを表示できます。例えば、ユーザーはSnowsightの Query History のページや、 Snowflake Information Schema のクエリや関数を呼び出すことで、このメタデータを表示することができます。実行中にエラーメッセージが編集された場合、実行後のメタデータでは、すべてのユーザーに対して常にエラーメッセージが編集されます。

実行中にエラーメッセージが編集されない場合、一部のユーザーにはメッセージが変更されずにメタデータに表示され、他のユーザーには編集されます。大文字と小文字のどちらでも、メタデータ上のエラーメッセージは変更されません。

  • メタデータを表示するユーザーには、 AUDIT 権限があります。

  • メタデータを表示しているユーザーが、エラーの原因となったステートメントを実行しました。

それ以外の場合、エラーメッセージはメタデータで編集されます。編集されたエラーメッセージには、以下のテキストが含まれます: Error in secure object

エラーメッセージの編集の例

以下の例では、エラーメッセージを編集して表示しています。編集は実行中または実行後のメタデータで行われます。

例1: セキュアビューのクエリ

次の例では、 SELECT 権限を持つユーザーがセキュアビューに対してクエリを実行し、エラーを返します。

セキュアビューを作成します。

CREATE SECURE VIEW myview
  AS SELECT a FROM mytable;
Copy

ビュークエリで使用しているテーブルを削除します。

DROP TABLE mytable;
Copy

ビューに対してクエリを実行します。

SELECT * FROM myview;
Copy

変更前に全ユーザーに表示されるエラーメッセージ

002037 (42601): SQL compilation error:
Failure during expansion of view 'MYVIEW': SQL compilation error:
Object 'DB.SC.MYTABLE' does not exist or not authorized.

変更後、一部のユーザーに表示されたエラーメッセージの編集

002037 (42601): SQL compilation error:
Failure during expansion of view 'MYVIEW': Error in secure object

例2: セキュア関数を呼び出すクエリの実行

以下の例では、セキュア関数の USAGE 権限を持つユーザーがセキュア関数を呼び出すクエリを実行しましたが、セキュア関数はエラーを返します。

例2a: 関数の引数がエラーになります

セキュリティ関数を作成します。

CREATE SECURE FUNCTION myfunction1(x FLOAT, y FLOAT)
  RETURNS FLOAT
  LANGUAGE SQL
AS
  'SELECT x / y';
Copy

セキュリティ関数を呼び出すクエリを実行します。

SELECT myfunction1(1, 0);
Copy
変更前に全ユーザーに表示されるエラーメッセージ
100051 (22012): Division by zero
変更後、一部のユーザーに表示されたエラーメッセージの編集
100051 (22012): Error in secure object

例2b: 関数が依存しているオブジェクトが削除された場合

セキュリティ関数を作成します。

CREATE SECURE FUNCTION myfunction2()
  RETURNS TABLE (a NUMBER)
  LANGUAGE SQL
AS
  'SELECT * FROM mytable';
Copy

関数で使用されているテーブルを削除します。

DROP TABLE mytable;
Copy

セキュリティ関数を呼び出すクエリを実行します。

SELECT * FROM TABLE(myfunction2());
Copy
変更前に全ユーザーに表示されるエラーメッセージ
002003 (42S02): SQL compilation error:
Object 'DB.SC.MYTABLE' does not exist or not authorized
変更後、一部のユーザーに表示されたエラーメッセージの編集
002003 (42S02): Error in secure object

例3: マスキングポリシーはエラーを返します

次の例では、ユーザーがマスキングポリシーがあるビューに対してクエリを実行し、エラーが発生します。

マスキングポリシーを作成します。

CREATE MASKING POLICY allowed_role_names_mp as (val NUMBER) RETURNS NUMBER ->
  CASE
    WHEN EXISTS
      (SELECT role FROM allowed_roles WHERE role = CURRENT_ROLE()) THEN val
    ELSE '********'
  END;
Copy

ビューを作成し、ビューの列にマスキングポリシーを設定します。

CREATE TABLE test_masking_policy(x NUMBER) AS
  SELECT * FROM VALUES (1), (2), (3);

CREATE VIEW myview_mp
  AS SELECT * FROM test_masking_policy;

ALTER VIEW myview_mp
  MODIFY COLUMN x SET MASKING POLICY allowed_role_names_mp;
Copy

マスキングポリシーで使用しているテーブルを削除します。

DROP TABLE allowed_roles;
Copy

マスキングポリシーの所有権限を持たないユーザーとして、ビューに対してクエリを実行します。

SELECT * FROM myview_mp;
Copy

変更前に全ユーザーに表示されるエラーメッセージ

002003 (42S02): SQL compilation error:
Object 'DB.SC.ALLOWED_ROLES' does not exist or not authorized.

変更後、一部のユーザーに表示されたエラーメッセージの編集

002003 (42S02): Error in secure object

例4: 行アクセスポリシーはエラーを返します

以下の例では、ユーザーが行アクセスポリシーを持つビューに対してクエリを実行し、エラーが発生しています。

行アクセスポリシーを作成します。

CREATE OR REPLACE ROW ACCESS POLICY myrap AS (role NUMBER) RETURNS BOOLEAN ->
  EXISTS (
    SELECT 1 FROM allowed_roles
      WHERE role::STRING = CURRENT_ROLE());
Copy

ビューを作成し、そのビューに行アクセスポリシーを追加します。

CREATE TABLE test_row_access_policy(x NUMBER) AS
  SELECT * FROM VALUES (1), (2), (3);

CREATE VIEW myview_rap
  AS SELECT * FROM test_row_access_policy;

ALTER VIEW myview_rap
  ADD ROW ACCESS POLICY myrap ON (x);
Copy

行アクセスポリシーで使用しているテーブルを削除します。

DROP TABLE allowed_roles;
Copy

行アクセスポリシーの OWNERSHIP 権限を持たないユーザーとしてビューをクエリします。

SELECT * FROM myview_rap;
Copy

変更前に全ユーザーに表示されるエラーメッセージ

002003 (42S02): SQL compilation error:
Object 'DB.SC.ALLOWED_ROLES' does not exist or not authorized.

変更後、一部のユーザーに表示されたエラーメッセージの編集

002003 (42S02): Error in secure object

参照: 1858