Categorias:

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

IS_ROLE_IN_SESSION

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

Entradas

Cadeia de caracteres literal para especificar uma função diretamente ou não literal para especificar um nome de coluna.

Retornos
  • TRUE:

    • Para um argumento de cadeia de caracteres literal, 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 especificada.

      Quando o valor DEFAULT_SECONDARY_ROLES é ALL, qualquer função concedida ao usuário herda os privilégios da função especificada.

      A função especificada pode ser a função primária ou secundária atual (ou seja, as funções retornadas por CURRENT_ROLE ou CURRENT_SECONDARY_ROLES, respectivamente) ou qualquer função inferior na hierarquia de funções.

    • Para um argumento não literal, o Snowflake avalia cada linha e retorna uma linha que contém um valor especificando uma função primária ou secundária ativa na sessão atual do usuário. Cada linha corresponde a um nome de função que a função primário ou secundário ativo pode ver.

  • FALSE:

    • Para um argumento literal de cadeia de caracteres, a função especificada é superior na hierarquia de funções das funções primárias ou secundárias atuais ou não está presente na hierarquia de funções.

    • Para um argumento não literal, o Snowflake avalia cada linha. Se uma linha contém um nome de função que é superior na hierarquia de funções das funções primárias ou secundárias atuais ou não está presente na hierarquia de funções, o Snowflake não retorna essa linha. Neste caso, o Snowflake retorna apenas linhas contendo os nomes das funções que a função primário ou secundário ativo pode ver (se houver).

  • NULL:

    • Em uma conta de consumidor que compartilha dados, essa função retorna NULL se referenciar um objeto compartilhado (por exemplo, uma UDF seguro ou exibição segura), como em uma condição de política de mascaramento. Este comportamento impede a exposição da hierarquia de funções em uma conta de consumidor de compartilhamento de dados.

Consulte também:

IS_OBJECT , Tópicos avançados de segurança em nível de coluna

Sintaxe

Literal — especificar uma função diretamente:

IS_ROLE_IN_SESSION( '<string_literal>' )
Copy

Não literal — especificar uma coluna:

IS_ROLE_IN_SESSION( <column_name> )
Copy

Argumentos

'string_literal'

O nome da função.

column_name

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

Notas de uso

  • 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 em letras maiúsculas.

    • 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_ROLE_IN_SESSION('ANALYST');

+-------------------------------+
| IS_ROLE_IN_SESSION('ANALYST') |
|-------------------------------|
| True                          |
+-------------------------------+
Copy

Retorna valores ativos de função primária ou secundária para a coluna chamada ROLE_NAME:

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

Especifique uma função diretamente em uma condição de política de mascaramento:

CREATE OR REPLACE MASKING POLICY allow_analyst AS (val string)
RETURNS string ->
CASE
  WHEN IS_ROLE_IN_SESSION('ANALYST') THEN val
  ELSE '*******'
END;
Copy

Especifique a coluna chamada AUTHZ_ROLE (ou seja, função autorizada) em uma política de acesso a linhas e, em seguida, defina a política na coluna da tabela:

Crie a política:

CREATE OR REPLACE ROW ACCESS POLICY rap_authz_role AS (authz_role string)
RETURNS boolean ->
IS_ROLE_IN_SESSION(authz_role);
Copy

Adicione a política a uma tabela:

ALTER TABLE allowed_roles
  ADD ROW ACCESS POLICY rap_authz_role ON (authz_role);
Copy

Especifique a coluna chamada AUTHZ_ROLE em uma política de acesso a linhas que usa uma tabela de mapeamento para procurar a função autorizada em uma coluna de tabela de mapeamento de nome ROLE_NAME. Após criar a política, adicione a política à tabela que contém a coluna AUTHZ_ROLE:

Crie a política:

CREATE OR REPLACE ROW ACCESS POLICY rap_authz_role_map AS (authz_role string)
RETURNS boolean ->
EXISTS (
  SELECT 1 FROM mapping_table m
  WHERE authz_role = m.key and IS_ROLE_IN_SESSION(m.role_name)
);
Copy

Adicione a política a uma tabela:

ALTER TABLE allowed_roles
  ADD ROW ACCESS POLICY rap_authz_role_map ON (authz_role);
Copy