Direitos restritos do chamador¶
Um executável, como um procedimento armazenado ou um serviço do Snowpark Container Services, pode ser executado com privilégios do proprietário do executável (direitos do proprietário) ou do chamador do executável (direitos do chamador). Se um executável for executado com os direitos do chamador, ele poderá executar uma ação somente se o chamador tiver privilégios para executar essa ação fora do contexto do executável.
Os direitos restritos do chamador permitem que um executável seja executado com os direitos do chamador, mas restringe os privilégios do chamador com os quais o executável é executado. Com os direitos restritos do chamador, um executável não pode ser executado com um privilégio específico, a menos que um administrador o permita expressamente.
Sobre as concessões do chamador¶
Os administradores usam concessões do chamador para definir com quais privilégios do chamador um executável pode ser executado. Por exemplo, se um chamador tiver privilégios SELECT e INSERT em uma tabela, mas não houver uma concessão do chamador que permita que o executável seja executado com o privilégio INSERT, o executável com direitos restritos do chamador não poderá ser executado com o privilégio INSERT ao atuar sobre a tabela.
Uma concessão do chamador não concede nenhum privilégio, mas restringe quais privilégios existentes do chamador são usados quando ele executa o executável. Por exemplo, se um chamador executar um procedimento armazenado para selecionar em uma tabela, o chamador já deve ter o privilégio SELECT na tabela e a concessão do chamador deve permitir que o procedimento armazenado seja executado com o privilégio SELECT.
As concessões do chamador são concedidas pelo administrador para a função que possui um executável. As concessões do chamador são concedidas em objetos, como tabelas e warehouses que o executável acessa. Quando o executável tenta acessar os objetos, as concessões do chamador associadas ao proprietário do executável são usadas para determinar quais privilégios do chamador podem ser usados para a operação.
Executáveis que são executados com direitos do chamador restritos¶
O usuário que cria um executável define se o executável é executado com direitos de proprietário, direitos de chamador ou direitos restritos de chamador. Se eles escolherem direitos restritos do chamador, cada privilégio exigido pelo executável deverá ser especificado em uma ou mais concessões do chamador que são concedidas ao proprietário do executável.
Para um procedimento armazenado, o parâmetro EXECUTE AS
define se o procedimento é executado com direitos do proprietário, direitos do chamador ou direitos restritos do chamador. A seguir, um exemplo de definição do procedimento a ser executado com direitos restritos do chamador:
CREATE OR REPLACE PROCEDURE sp_pi()
RETURNS FLOAT NOT NULL
LANGUAGE JAVASCRIPT
EXECUTE AS RESTRICTED CALLER
AS
$$
RETURN 3.1415926;
$$
;
Para obter uma lista de restrições sobre executáveis que são executados com direitos de chamador restritos, consulte Limitações de um executável com direitos de chamador restritos.
Como conceder concessões do chamador¶
As concessões do chamador são concedidas em objetos, como tabelas e bancos de dados que um executável acessa. As concessões do chamador são concedidas para a função ou a função de banco de dados que possui o executável.
A instrução GRANT que um administrador usa para conceder uma concessão ao chamador tem variações diferentes, dependendo de como você deseja conceder concessões ao chamador. As variações são as seguintes:
GRANT CALLER – Concede permissões ao chamador em um objeto específico. Cada concessão de chamador criada pela instrução permite que o executável seja executado com um privilégio específico.
GRANT ALL CALLER PRIVILEGES – Concede permissões ao chamador sobre um objeto específico. As concessões do chamador criadas pela instrução permitem que o executável seja executado com todos os privilégios do chamador.
GRANT INHERITED CALLER – Concede permissões ao chamador em todos os objetos atuais e futuros do mesmo tipo quando eles compartilham um esquema, banco de dados ou conta comum. Cada concessão de chamador criada pela instrução permite que o executável seja executado com um privilégio específico.
GRANT ALL INHERITED CALLER PRIVILEGES – Concede permissões ao chamador sobre todos os objetos atuais e futuros do mesmo tipo quando eles compartilham um esquema, banco de dados ou conta comum. As concessões do chamador criadas pela instrução permitem que o executável seja executado com todos os privilégios do chamador.
Uma única instrução GRANT pode resultar em várias concessões do chamador concedidas ao proprietário do executável. Por exemplo, GRANT CALLER INSERT, SELECT … resulta em duas concessões ao chamador, uma para o privilégio INSERT e outra para o privilégio SELECT. Da mesma forma, uma instrução GRANT ALL INHERITED CALLER PRIVILEGES resulta em uma concessão do chamador para cada privilégio que pode ser concedido no tipo de objeto especificado.
Para obter a sintaxe completa, incluindo parâmetros, para conceder uma concessão ao chamador, consulte GRANT CALLER.
Exemplos¶
A seguir, exemplos de como um administrador pode usar as concessões do chamador para controlar com quais privilégios do chamador um executável pode ser executado.
Os executáveis pertencentes a owner_role
que acessam uma exibição v1
podem ser executados com o privilégio SELECT na exibição:
GRANT CALLER SELECT ON VIEW v1 TO owner_role;
Os executáveis pertencentes a owner_role
que acessam qualquer tabela no esquema db.sch
podem ser executados com os privilégios SELECT e INSERT do chamador.
GRANT INHERITED CALLER SELECT, INSERT ON ALL TABLES IN SCHEMA db.sch TO ROLE owner_role;
Os executáveis pertencentes a owner_role
que acessam esquemas na conta atual podem ser executados com todos os privilégios do chamador nos esquemas.
GRANT ALL INHERITED CALLER PRIVILEGES ON ALL SCHEMAS IN ACCOUNT TO ROLE owner_role;
Os executáveis pertencentes à função de banco de dados db.r
que acessam a tabela db.sch1.t1
podem ser executados com o privilégio SELECT na tabela.
GRANT CALLER SELECT ON TABLE db.sch1.t1 TO DATABASE ROLE db.r;
Os executáveis pertencentes a owner_role
que acessam o banco de dados my_db
podem ser executados com todos os privilégios do chamador no banco de dados.
GRANT ALL CALLER PRIVILEGES ON DATABASE my_db TO ROLE owner_role;
Revogação de uma concessão do chamador¶
Os administradores usam a instrução REVOKE para revogar privilégios que foram concedidos anteriormente a um proprietário de executável por meio de uma concessão de chamador. Essa instrução tem diferentes variações, dependendo de como você deseja revogar as concessões do chamador.
REVOKE CALLER — Revogar privilégios específicos em um objeto específico.
REVOKE ALL CALLER PRIVILEGES — Revogar todos os privilégios em um objeto específico. O executável não poderá ser executado com nenhum privilégio do chamador quando tentar acessar o objeto.
REVOKE INHERITED CALLER — Revogar concessões do chamador em todos os objetos atuais e futuros do mesmo tipo quando eles compartilham um esquema, banco de dados ou conta comum. Somente os privilégios em uma lista especificada são revogados.
REVOKE ALL INHERITED CALLER PRIVILEGES — Revogar concessões do chamador em todos os objetos atuais e futuros do mesmo tipo quando eles compartilham um esquema, banco de dados ou conta comum. Todos os privilégios são revogados; o executável não poderá ser executado com nenhum privilégio do chamador.
A execução de um comando REVOKE INHERITED CALLER ou REVOKE ALL INHERITED CALLER PRIVILEGES não revoga uma concessão do chamador que foi concedida em um objeto específico dentro da conta, do banco de dados ou do esquema usando uma instrução GRANT CALLER. Por exemplo, se você concedeu uma concessão de chamador na tabela my_db.sch1.t1
diretamente, a execução de REVOKE INHERITED CALLER SELECT ON ALL TABLES IN DATABASE my_db ...
não revoga a concessão de chamador em t1
.
Para obter a sintaxe completa, incluindo parâmetros, da revogação de uma concessão do chamador, consulte REVOKE CALLER.
Exemplos¶
Os executáveis pertencentes a owner_role
não podem mais ser executados com os privilégios do chamador quando acessam exibições na conta atual.
REVOKE ALL INHERITED CALLER PRIVILEGES ON ALL VIEWS IN ACCOUNT FROM ROLE owner_role;
Os executáveis pertencentes a owner_role
não podem mais ser executados com o privilégio USAGE quando acessam o esquema db.sch1
.
REVOKE CALLER USAGE ON SCHEMA db.sch1 FROM ROLE owner_role;
Como listar concessões do chamador¶
Os usuários podem usar o comando SHOW CALLER GRANTS para listar as concessões do chamador. Você pode usar esse comando para listar todas as concessões do chamador que foram concedidas a um proprietário específico (SHOW CALLER GRANTS TO …) ou para listar todas as concessões do chamador em um objeto específico (SHOW CALLER GRANTS ON …).
Se você executar um comando SHOW CALLER GRANTS ON … para um objeto específico, cada linha poderá indicar uma das seguintes opções:
Uma concessão do chamador foi concedida diretamente no objeto.
Por exemplo, a saída de
SHOW CALLER GRANTS ON TABLE db.sch.t1
contém uma linha se o administrador executouGRANT CALLER SELECT ON TABLE db.sch.t1
.O objeto herdou uma concessão do chamador.
Por exemplo, a saída de
SHOW CALLER GRANTS ON TABLE db1.sch.t1
contém uma linha se o administrador executouGRANT INHERITED CALLER SELECT ON ALL TABLES IN SCHEMA db1.sch
.O objeto foi especificado com uma cláusula IN para que outros objetos que ele contém herdem as concessões do chamador.
Por exemplo, a saída de
SHOW CALLER GRANTS ON ACCOUNT
contém uma linha se o administrador executouGRANT INHERITED CALLER SELECT ON ALL TABLES IN ACCOUNT
.O objeto é um ancestral de um objeto com uma concessão de chamador herdada, bem como o descendente do objeto que foi especificado com uma cláusula IN que resultou na herança.
Por exemplo,
SHOW CALLER GRANTS ON SCHEMA my_db.sch1
contém uma linha se o administrador executouGRANT INHERITED CALLER SELECT ON ALL TABLES IN DATABASE my_db
.
Saída condicional¶
A saída do comando SHOW CALLER GRANTS varia de acordo com os privilégios da função executora. Quando um usuário executa SHOW CALLER GRANTS, os resultados contêm apenas objetos nos quais ele tem pelo menos um privilégio; ele não pode descobrir a existência de um objeto a menos que possa acessá-lo, mesmo que haja uma concessão de chamador nele.
Por exemplo, suponha que haja uma concessão de chamador nos bancos de dados DB1
e DB2
. Agora, suponha que a função R2
tenha o privilégio USAGE em DB1
, mas nenhum privilégio em DB2
. Quando R2
executa SHOW CALLER GRANTS, a saída mostra que há uma concessão do chamador em DB1
, mas não lista DB2
. Se R2
tivesse privilégios em ambos os bancos de dados, a saída mostraria que a concessão do chamador está em ambos os bancos de dados.
Exemplos¶
Liste as concessões do chamador que foram concedidas na tabela t1
.
SHOW CALLER GRANTS ON TABLE t1;
Liste todas as concessões do chamador que foram concedidas para a conta atual. Isso inclui concessões diretamente na conta (GRANT CALLER … ON ACCOUNT) e concessões para todos os objetos em uma conta (GRANT INHERITED CALLER… IN ACCOUNT).
SHOW CALLER GRANTS ON ACCOUNT;
Liste todas as concessões do chamador que foram concedidas à função de banco de dados db.owner_role
.
SHOW CALLER GRANTS TO DATABASE ROLE db.owner_role;
Limitações de concessões do chamador¶
As concessões do chamador não são replicadas ou clonadas.
Limitações de um executável com direitos de chamador restritos¶
Se um executável for executado com direitos de chamador restritos, ele estará sujeito às seguintes restrições.
Estágios externos
O executável não pode criar um estágio externo sem especificar uma integração de armazenamento.
O executável não pode ser copiado em um estágio externo.
O executável não pode ser copiado em um URL externo sem especificar uma integração de armazenamento.
Procedimentos armazenados
O executável não pode criar objetos Snowflake que sejam executados com direitos do proprietário, direitos do chamador ou direitos restritos do chamador. Por exemplo, ele não pode criar um procedimento armazenado.
O executável não pode alterar os direitos com os quais um procedimento armazenado é executado. Por exemplo, o executável não pode alterar um procedimento armazenado dos direitos do proprietário para os direitos do chamador.
Funções e privilégios
O executável não pode executar os comandos USE ROLE e USE SECONDARY ROLES.
O executável não pode usar as instruções GRANT para conceder privilégios e concessões ao chamador.
O executável não pode usar as instruções REVOKE para revogar privilégios e concessões do chamador.
Referências
O executável não pode criar referências transitórias e persistentes.
Operações relacionadas à sessão
O executável não pode executar SHOW VARIABLES ou SHOW PARAMETERS.
O executável não pode usar ou ler variáveis de sessão.
O executável não pode executar ALTER SESSION.
O executável não pode criar objetos temporários com escopo de sessão.
O executável não pode executar USE DATABASE, USE SCHEMA ou USE WAREHOUSE.