セキュアオブジェクト: エラーメッセージの情報の編集(保留中)¶
セキュアオブジェクトに関連するエラーメッセージは以下のように動作します。
- 変更前:
セキュアオブジェクトに関連するエラーメッセージには、メッセージの全文が表示されます。
- 変更後:
セキュリティオブジェクトに関連するエラーメッセージは、編集される可能性があります。
この変更は、以下のタイプのオブジェクトに関するエラーメッセージに適用されます。
セキュア関数 (セキュアテーブル関数を含む)
セキュリティオブジェクトの詳細については、 セキュアオブジェクトを使用したデータアクセスの制御を使用する をご参照ください。
セキュアオブジェクトの展開または評価中にエラーが検出された場合、エラーメッセージは編集の対象となります。エラーメッセージが編集されても、エラーコードは変更されません。
エラーメッセージの変更には、実行中の編集と実行後のメタデータでの編集の2つのタイプがあります。これらのタイプの変更については、以下のセクションで説明します。
実行中の編集¶
エラーメッセージ全体、またはエラーメッセージの一部を、操作中にエラーが返されたときに編集することができます。一般的に、このタイプのエラーメッセージの編集は、ユーザーがセキュアオブジェクトの OWNERSHIP 権限を持たずにセキュアオブジェクトを使用しようとしたときに発生します。
実行後のメタデータの編集¶
ユーザーはエラー発生後、エラーメッセージを含むエラーに関するメタデータを表示できます。例えば、ユーザーはSnowsightの Query History のページや、 Snowflake Information Schema のクエリや関数を呼び出すことで、このメタデータを表示することができます。実行中にエラーメッセージが編集された場合、実行後のメタデータでは、すべてのユーザーに対して常にエラーメッセージが編集されます。
実行中にエラーメッセージが編集されない場合、一部のユーザーにはメッセージが変更されずにメタデータに表示され、他のユーザーには編集されます。大文字と小文字のどちらでも、メタデータ上のエラーメッセージは変更されません。
メタデータを表示するユーザーには、 AUDIT 権限があります。
メタデータを表示しているユーザーが、エラーの原因となったステートメントを実行しました。
それ以外の場合、エラーメッセージはメタデータで編集されます。編集されたエラーメッセージには、以下のテキストが含まれます: Error in secure object
。
エラーメッセージの編集の例¶
以下の例では、エラーメッセージを編集して表示しています。編集は実行中または実行後のメタデータで行われます。
例1: セキュアビューのクエリ¶
次の例では、 SELECT 権限を持つユーザーがセキュアビューに対してクエリを実行し、エラーを返します。
セキュアビューを作成します。
CREATE SECURE VIEW myview
AS SELECT a FROM mytable;
ビュークエリで使用しているテーブルを削除します。
DROP TABLE mytable;
ビューに対してクエリを実行します。
SELECT * FROM myview;
変更前に全ユーザーに表示されるエラーメッセージ¶
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';
セキュリティ関数を呼び出すクエリを実行します。
SELECT myfunction1(1, 0);
変更前に全ユーザーに表示されるエラーメッセージ¶
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';
関数で使用されているテーブルを削除します。
DROP TABLE mytable;
セキュリティ関数を呼び出すクエリを実行します。
SELECT * FROM TABLE(myfunction2());
変更前に全ユーザーに表示されるエラーメッセージ¶
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;
ビューを作成し、ビューの列にマスキングポリシーを設定します。
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;
マスキングポリシーで使用しているテーブルを削除します。
DROP TABLE allowed_roles;
マスキングポリシーの所有権限を持たないユーザーとして、ビューに対してクエリを実行します。
SELECT * FROM myview_mp;
変更前に全ユーザーに表示されるエラーメッセージ¶
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());
ビューを作成し、そのビューに行アクセスポリシーを追加します。
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);
行アクセスポリシーで使用しているテーブルを削除します。
DROP TABLE allowed_roles;
行アクセスポリシーの OWNERSHIP 権限を持たないユーザーとしてビューをクエリします。
SELECT * FROM myview_rap;
変更前に全ユーザーに表示されるエラーメッセージ¶
002003 (42S02): SQL compilation error:
Object 'DB.SC.ALLOWED_ROLES' does not exist or not authorized.
変更後、一部のユーザーに表示されたエラーメッセージの編集¶
002003 (42S02): Error in secure object
参照: 1858