Objetos seguros: edição de informações em mensagem de erro (Pendente)¶
As mensagens de erro relacionadas a objetos seguros se comportam da seguinte forma:
- Antes da mudança:
As mensagens de erro relacionadas a objetos seguros mostram a mensagem completa.
- Após a mudança:
As mensagens de erro relacionadas a objetos seguros podem ser editadas.
A mudança se aplica a mensagens de erro relacionadas aos seguintes tipos de objetos:
Funções seguras (incluindo funções de tabela seguras)
Para obter mais informações sobre objetos seguros, consulte Uso dos objetos seguros para controlar o acesso aos dados.
Quando um erro é detectado durante a expansão ou avaliação de um objeto seguro, a mensagem de erro é considerada para edição. Quando uma mensagem de erro é editada, o código de erro permanece inalterado.
São possíveis dois tipos de mudanças nas mensagens de erro: edição durante a execução e edição nos metadados após a execução. Esses tipos de mudanças são descritos nas seções a seguir.
Edições durante a execução¶
Uma mensagem de erro inteira ou parte de uma mensagem de erro pode ser editada quando o erro é retornado durante uma operação. Em geral, esse tipo de edição de mensagem de erro ocorre quando um usuário tenta usar um objeto seguro sem ter o privilégio OWNERSHIP para o objeto seguro.
Edições em metadados após a execução¶
Os usuários podem visualizar os metadados sobre os erros depois que eles ocorrem, incluindo as mensagens de erro. Por exemplo, os usuários podem visualizar esses metadados na página Query History no Snowsight, ou consultando exibições e chamando funções no Snowflake Information Schema. Quando uma mensagem de erro é editada durante a execução, a mensagem de erro é sempre editada nos metadados após a execução para todos os usuários.
Quando uma mensagem de erro não é editada durante a execução, a mensagem aparece inalterada nos metadados para alguns usuários e é editada para outros usuários. A mensagem de erro não é alterada nos metadados em nenhum dos seguintes casos:
O usuário que visualiza os metadados tem o privilégio AUDIT.
O usuário que visualiza os metadados executou a instrução que causou o erro.
Em todos os outros casos, a mensagem de erro é editada nos metadados. As mensagens de erro editadas incluem o texto: Error in secure object
.
Exemplos de edição de mensagens de erro¶
Os exemplos a seguir mostram mensagens de erro que foram editadas. A edição pode ocorrer durante a execução ou nos metadados após a execução.
Exemplo 1: consulta de uma exibição segura¶
No exemplo a seguir, um usuário com privilégio SELECT em uma exibição segura executa uma consulta na exibição que retorna um erro.
Crie a exibição segura:
CREATE SECURE VIEW myview
AS SELECT a FROM mytable;
Descarte a tabela usada na consulta da exibição:
DROP TABLE mytable;
Execute uma consulta na exibição:
SELECT * FROM myview;
Mensagem de erro exibida para todos os usuários antes da mudança¶
002037 (42601): SQL compilation error:
Failure during expansion of view 'MYVIEW': SQL compilation error:
Object 'DB.SC.MYTABLE' does not exist or not authorized.
Mensagem de erro editada e exibida para alguns usuários após a mudança¶
002037 (42601): SQL compilation error:
Failure during expansion of view 'MYVIEW': Error in secure object
Exemplo 2: execução de uma consulta que chama uma função segura¶
Nos exemplos a seguir, um usuário com privilégio USAGE em uma função segura executa uma consulta que chama a função segura, mas a função segura retorna um erro.
Exemplo 2a: os argumentos da função resultam em um erro¶
Crie a função segura:
CREATE SECURE FUNCTION myfunction1(x FLOAT, y FLOAT)
RETURNS FLOAT
LANGUAGE SQL
AS
'SELECT x / y';
Execute uma consulta que chama a função segura:
SELECT myfunction1(1, 0);
Mensagem de erro exibida para todos os usuários antes da mudança¶
100051 (22012): Division by zero
Mensagem de erro editada e exibida para alguns usuários após a mudança¶
100051 (22012): Error in secure object
Exemplo 2b: um objeto do qual a função depende é excluído¶
Crie a função segura:
CREATE SECURE FUNCTION myfunction2()
RETURNS TABLE (a NUMBER)
LANGUAGE SQL
AS
'SELECT * FROM mytable';
Descarte a tabela usada na função:
DROP TABLE mytable;
Execute uma consulta que chama a função segura:
SELECT * FROM TABLE(myfunction2());
Mensagem de erro exibida para todos os usuários antes da mudança¶
002003 (42S02): SQL compilation error:
Object 'DB.SC.MYTABLE' does not exist or not authorized
Mensagem de erro editada e exibida para alguns usuários após a mudança¶
002003 (42S02): Error in secure object
Exemplo 3: uma política de mascaramento retorna um erro¶
No exemplo a seguir, um usuário executa uma consulta em uma exibição com uma política de mascaramento que encontra um erro.
Crie uma política de mascaramento:
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;
Crie uma exibição e defina a política de mascaramento em uma coluna da exibição:
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;
Descarte a tabela usada na política de mascaramento:
DROP TABLE allowed_roles;
Execute uma consulta na exibição como um usuário que não tem privilégios de propriedade para a política de mascaramento:
SELECT * FROM myview_mp;
Mensagem de erro exibida para todos os usuários antes da mudança¶
002003 (42S02): SQL compilation error:
Object 'DB.SC.ALLOWED_ROLES' does not exist or not authorized.
Mensagem de erro editada e exibida para alguns usuários após a mudança¶
002003 (42S02): Error in secure object
Exemplo 4: uma política de acesso a linhas retorna um erro¶
No exemplo a seguir, um usuário executa uma consulta em uma exibição com uma política de acesso a linhas e encontra um erro.
Crie uma política de acesso a linhas:
CREATE OR REPLACE ROW ACCESS POLICY myrap AS (role NUMBER) RETURNS BOOLEAN ->
EXISTS (
SELECT 1 FROM allowed_roles
WHERE role::STRING = CURRENT_ROLE());
Crie uma exibição e adicione a política de acesso a linhas na exibição:
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);
Descarte a tabela usada na política de acesso a linhas:
DROP TABLE allowed_roles;
Consulte a exibição como um usuário que não tem privilégios OWNERSHIP para a política de acesso a linhas:
SELECT * FROM myview_rap;
Mensagem de erro exibida para todos os usuários antes da mudança¶
002003 (42S02): SQL compilation error:
Object 'DB.SC.ALLOWED_ROLES' does not exist or not authorized.
Mensagem de erro editada e exibida para alguns usuários após a mudança¶
002003 (42S02): Error in secure object
Ref: 1858