安全对象:编辑错误消息中的信息(待定)¶
与安全对象相关的错误消息的行为如下:
- 变更前:
与安全对象相关的错误消息显示完整消息。
- 变更后:
可能会编辑与安全对象相关的错误消息。
此变更适用于与以下类型对象相关的错误消息:
有关安全对象的详细信息,请参阅 使用安全对象控制数据访问。
在扩展或评估安全对象期间检测到错误时,将考虑对错误消息进行编辑。编辑错误消息后,错误代码保持不变。
可能有两种类型的错误消息变更:执行过程中的编辑和执行后的元数据编辑。以下各节将介绍这些类型的变更。
执行过程中的编辑¶
在操作期间返回错误时,可以编辑整条错误消息或其中一部分。通常,当用户尝试使用安全对象时,如果没有安全对象的 OWNERSHIP 权限,则会发生此类错误消息编辑。
执行后的元数据编辑¶
用户可以在错误发生后查看有关错误的元数据,包括错误消息。例如,用户可以在 Snowsight 的 Query History 页面中查看此元数据,也可以通过查询视图和调用 Snowflake Information Schema 中的函数来查看此元数据。在执行过程中编辑错误消息时,始终会在执行后,在元数据中为所有用户编辑错误消息。
在执行过程中未编辑错误消息时,对于某些用户,该消息在元数据中显示不变,对于其他用户,则会编辑该消息。在以下任一情况下,元数据中的错误消息都保持不变:
查看元数据的用户具有 AUDIT 权限。
查看元数据的用户执行了导致错误的语句。
在所有其他情况下,都会编辑元数据中的错误消息。编辑的错误消息包括文本:Error in secure object
。
错误消息编辑示例¶
以下示例显示了被编辑的错误消息。编辑可以在执行过程中发生,也可以在执行后的元数据中发生。
示例 :查询安全视图¶
在以下示例中,对安全视图具有 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