- Categorias:
Funções de contexto (Objeto da sessão)
IS_ROLE_IN_SESSION¶
Verifica se a função de conta especificada está na hierarquia de funções primária ou secundária atualmente ativa.
Essa função examina apenas o conjunto de funções ativas atualmente e não as funções ativadas na sessão. As funções atualmente ativas podem ser diferentes das funções de sessão, por exemplo, ao executar um procedimento de direitos do proprietário ou um Streamlit.
- Consulte também:
Sintaxe¶
Literal — especificar uma função diretamente:
IS_ROLE_IN_SESSION( '<string_literal>' )
Expressão — especificar uma expressão de função:
IS_ROLE_IN_SESSION( <expr> )
Coluna — especificar uma coluna:
IS_ROLE_IN_SESSION( <column_name> )
Argumentos¶
'string_literal'
O nome da função.
expr
Uma expressão que retorna o nome da função.
column_name
O nome da coluna em uma tabela ou exibição que contém o nome da função.
Retornos¶
TRUE
:Para um argumento do tipo literal de cadeia de caracteres ou expressão, a função primária ou as funções secundárias ativas do usuário atual na sessão herdam 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 de coluna, o Snowflake avalia cada linha e retorna uma linha que contém um valor que especifica 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 de expressão ou 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 a função não está 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
Essa função retorna NULL quando usada em um objeto compartilhado, como uma exibição segura, quando acessada por meio de uma conta de consumidor de compartilhamento de dados. Este comportamento impede a exposição da hierarquia de funções em uma conta de consumidor de compartilhamento de dados.
Notas de uso¶
Use uma sintaxe.
Sintaxe do nome:
Apenas um nome de função pode ser passado como 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.
Sintaxe da coluna:
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;
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;
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 | +-------------------------------+
Retorna valores ativos de função primária ou secundária para a coluna chamada ROLE_NAME:
SELECT * FROM d1.s1.t1 WHERE IS_ROLE_IN_SESSION(t1.role_name);
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;
Especifique uma expressão de função em uma condição de política de mascaramento:
CREATE OR REPLACE MASKING POLICY allow_tag_role AS (val string) RETURNS string -> CASE WHEN IS_ROLE_IN_SESSION(SYSTEM$GET_TAG_ON_CURRENT_TABLE('D1.S1.ALLOWED_ROLE')) THEN val ELSE '*******' END;
Especifique a coluna chamada AUTHZ_ROLE (ou seja, a 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);Adicione a política a uma tabela:
ALTER TABLE allowed_roles ADD ROW ACCESS POLICY rap_authz_role ON (authz_role);
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) );Adicione a política a uma tabela:
ALTER TABLE allowed_roles ADD ROW ACCESS POLICY rap_authz_role_map ON (authz_role);