Categorias:

Funções de contexto (Objeto da sessão)

IS_DATABASE_ROLE_IN_SESSION

Verifica se a função do banco de dados está na hierarquia de funções primária ou secundária ativa do usuário para a sessão atual ou se a coluna especificada contém uma função de banco de dados que está na hierarquia de funções primária ou secundária ativa do usuário para a sessão atual.

Entradas:

Cadeia de caracteres literal para especificar o nome da função de banco de dados ou não literal para especificar um nome de coluna.

Retornos:
  • True:

    • Para um argumento literal (nome da função do banco de dados), a função primária ou funções secundárias ativa do usuário atual na sessão herda os privilégios da função de banco de dados especificada.

    • Para um argumento não literal (nome da coluna), o Snowflake avalia cada linha da tabela e retorna uma linha que contém um valor que especifica uma função de banco de dados na sessão atual do usuário. Cada linha corresponde a um nome de função de banco de dados originado do banco de dados em uso ou do banco de dados especificado em uma consulta.

  • False:

    • Para um argumento literal, a função de banco de dados especificada não está na hierarquia de funções da função primária ou secundária do usuário atual.

    • Para um argumento não literal, o Snowflake não retornará uma linha se a função do banco de dados não estiver na coluna da tabela do banco de dados em uso ou do banco de dados especificado em uma consulta.

    • Especificar o nome completo de uma função de banco de dados no formato database_name.database_role_name. Use o nome relativo, database_role_name.

Sintaxe

Literal — especifica uma função de banco de dados diretamente:

IS_DATABASE_ROLE_IN_SESSION( '<string_literal>' )
Copy

Não literal — especificar uma coluna:

IS_DATABASE_ROLE_IN_SESSION( <column_name> )
Copy

Argumentos

'string_literal'

O nome da função do banco de dados.

Especifique o nome relativo da função de banco de dados. A função será avaliada como False se você especificar o nome completo.

column_name

O nome da coluna em uma tabela ou exibição.

Notas de uso

Estas notas se aplicam apenas à função IS_DATABASE_ROLE_IN_SESSION:

  • Use esta tabela para prever a avaliação da função quando o argumento da função for uma cadeia de caracteres literal:

    Contexto

    Avaliação

    Consulta.

    Banco de dados de sessão.

    Definição de tabela ou exibição com cláusula WHERE.

    Depende do seguinte:

    • Se você tiver um banco de dados em uso e usar o nome relativo da tabela ou exibição, o contexto será o banco de dados em uso (banco de dados de sessão).

    • Se você especificar o nome completo da tabela ou exibição, o contexto será o banco de dados que contém a tabela ou exibição.

    Tabela ou exibição protegida.

    Banco de dados que contém a tabela ou exibição.

    Procedimento armazenado dos direitos do proprietário.

    Banco de dados contendo o procedimento armazenado.

    Procedimento armazenado de direitos do chamador.

    Banco de dados de sessão.

    UDF

    Banco de dados que contém a tabela ou exibição protegida.

    Se a UDF não for chamada em uma política, a função será avaliada para o banco de dados que contém a UDF.

  • Uma função de banco de dados torna-se ativa na hierarquia de funções quando o banco de dados que contém a função de banco de dados está em uso ou ao consultar uma tabela no mesmo banco de dados que contém a função de banco de dados.

    Se você for um consumidor de compartilhamento de dados e estiver usando uma função de banco de dados para consultar dados protegidos por política, carregue o banco de dados que contém a tabela protegida com um comando USE DATABASE database_name antes de consultar os dados protegidos por política. Alternativamente, especifique o nome completo do objeto protegido na consulta. Qualquer uma dessas abordagens ativa a função do banco de dados na hierarquia de funções da função atual do usuário. Para obter mais detalhes, consulte Compartilhamento de dados protegidos por uma política.

  • Ao especificar essa função no body de uma política de acesso a dados, como uma política de mascaramento ou de acesso a linhas, a função usa o banco de dados e o esquema da tabela protegida.

    Por exemplo, se você adicionar uma política de acesso a linhas à tabela hr.tables.empl_info, a função procurará seu argumento, o nome da função do banco de dados ou o nome da coluna, no banco de dados hr porque esse banco de dados contém a tabela protegida.

  • Você deve evitar estruturas de consulta que exijam que o Snowflake crie uma exibição embutida. Nesse contexto, uma exibição embutida é uma exibição temporária que o Snowflake cria para determinar o resultado da consulta. Por exemplo, se sua consulta chamar essa função e você especificar uma cláusula WITH no início da consulta ou especificar uma subconsulta na cláusula FROM, o Snowflake retornará um erro:

    Could not resolve the database for IS_DATABASE_ROLE_IN_SESSION({})
    

    Onde {} é um espaço reservado para o argumento da função na sua consulta. O motivo do erro é que Snowflake não possui informações suficientes para avaliar o contexto do argumento da função. Para resolver a mensagem de erro, simplifique sua consulta, como remover a cláusula WITH ou remover a subconsulta na cláusula FROM.

  • Quando o valor de propriedade do usuário DEFAULT_SECONDARY_ROLES for ALL, a função retornará True se qualquer função da conta concedida ao usuário herdar os privilégios da função de banco de dados especificada.

  • Ao usar essa função na condição de uma política de mascaramento ou de acesso a linhas que protege dados compartilhados, certifique-se de que o banco de dados que contém a política e os dados protegidos pela política seja compartilhado com a conta do consumidor. A política e os dados protegidos por política podem estar no mesmo banco de dados ou em bancos de dados diferentes. Para obter mais detalhes, consulte Compartilhamento de dados protegidos por uma política.

Estas notas se aplicam às funções IS_DATABASE_ROLE_IN_SESSION e IS_ROLE_IN_SESSION:

  • Use uma sintaxe.

  • Sintaxe literal:

    • Apenas um nome de função de banco de dados pode ser passado como um argumento.

    • O argumento deve ser uma cadeia de caracteres e usar a mesma caixa de como a função é armazenada no Snowflake. Para obter mais detalhes, consulte Requisitos para identificadores.

    • O nome de uma função de conta não é compatível.

  • Sintaxe não literal:

    • Apenas uma coluna pode ser passada como argumento.

    • A coluna deve ter um tipo de dados STRING.

    • Especifique a coluna como uma das seguintes:

      • column_name

      • table_name.column_name

      • schema_name.table_name.column_name

      • database_name.schema_name.table_name.column_name

  • Colunas virtuais

    Uma coluna virtual, que contém o resultado de um valor calculado de uma expressão em vez do valor calculado que está sendo armazenado na tabela, não é suportada.

    SELECT IS_ROLE_IN_SESSION(UPPER(authz_role)) FROM t1;
    
    Copy

    Uma coluna virtual só é suportada quando a expressão tem um alias para o nome da coluna:

    CREATE VIEW v2 AS
    SELECT
      authz_role,
      UPPER(authz_role) AS upper_authz_role
    FROM t2;
    
    SELECT IS_ROLE_IN_SESSION(upper_authz_role) FROM v2;
    
    Copy
  • Políticas:

    Se você usar essas funções com uma política de mascaramento ou uma política de acesso a linhas, verifique se sua conta Snowflake é Enterprise Edition ou superior.

    O Snowflake recomenda o uso dessa função quando as condições da política precisarem avaliar a hierarquia de funções e os privilégios herdados.

  • Cache de resultados:

    Se você usar essa função em uma política de mascaramento ou em uma política de acesso a linhas e nem a política nem a tabela ou coluna protegida pela política forem alteradas em relação a uma consulta anterior, você poderá usar a função RESULT_SCAN para retornar os resultados de uma consulta na tabela protegida. O cache de resultados se aplica somente ao uso da sintaxe não literal.

  • Essas funções não podem ser usadas na definição da exibição materializada porque essas funções não são deterministas e o Snowflake não pode determinar quais dados devem ser materializados.

Exemplos

Verificar se os privilégios concedidos a uma função específica são herdados pela função atual na sessão:

SELECT IS_DATABASE_ROLE_IN_SESSION('R1');
Copy
+-----------------------------------+
| IS_DATABASE_ROLE_IN_SESSION('R1') |
+-----------------------------------+
| True                              |
+-----------------------------------+

Retorne valores de função de banco de dados para a coluna denominada ROLE_NAME:

SELECT *
FROM myb.s1.t1
WHERE IS_DATABASE_ROLE_IN_SESSION(role_name);
Copy

Para exemplos adicionais relacionados ao compartilhamento seguro de dados, consulte Compartilhamento de dados protegidos por uma política.