安全对象:编辑错误消息中的信息(待定)

与安全对象相关的错误消息的行为如下:

变更前:

与安全对象相关的错误消息显示完整消息。

变更后:

可能会编辑与安全对象相关的错误消息。

此变更适用于与以下类型对象相关的错误消息:

有关安全对象的详细信息,请参阅 使用安全对象控制数据访问

在扩展或评估安全对象期间检测到错误时,将考虑对错误消息进行编辑。编辑错误消息后,错误代码保持不变。

可能有两种类型的错误消息变更:执行过程中的编辑和执行后的元数据编辑。以下各节将介绍这些类型的变更。

执行过程中的编辑

在操作期间返回错误时,可以编辑整条错误消息或其中一部分。通常,当用户尝试使用安全对象时,如果没有安全对象的 OWNERSHIP 权限,则会发生此类错误消息编辑。

执行后的元数据编辑

用户可以在错误发生后查看有关错误的元数据,包括错误消息。例如,用户可以在 Snowsight 的 Query History 页面中查看此元数据,也可以通过查询视图和调用 Snowflake Information Schema 中的函数来查看此元数据。在执行过程中编辑错误消息时,始终会在执行后,在元数据中为所有用户编辑错误消息。

在执行过程中未编辑错误消息时,对于某些用户,该消息在元数据中显示不变,对于其他用户,则会编辑该消息。在以下任一情况下,元数据中的错误消息都保持不变:

  • 查看元数据的用户具有 AUDIT 权限。

  • 查看元数据的用户执行了导致错误的语句。

在所有其他情况下,都会编辑元数据中的错误消息。编辑的错误消息包括文本:Error in secure object

错误消息编辑示例

以下示例显示了被编辑的错误消息。编辑可以在执行过程中发生,也可以在执行后的元数据中发生。

示例 :查询安全视图

在以下示例中,对安全视图具有 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

语言: 中文