REVOKE <privilégios>

Remove um ou mais privilégios em um objeto protegível de uma função ou função de banco de dados. Os privilégios que podem ser revogados são específicos do objeto.

Funções

Os privilégios que podem ser revogados de funções são agrupados nas seguintes categorias:

  • Privilégios globais

  • Privilégios para objetos de conta (monitores de recursos, warehouses virtuais e bancos de dados)

  • Privilégios para esquemas

  • Privilégios para objetos de esquema (tabelas, visualizações, estágios, formatos de arquivo, UDFs e sequências)

Funções de banco de dados

Os privilégios que podem ser revogados de funções de banco de dados são agrupados nas seguintes categorias:

  • Privilégios para o banco de dados que contém a função de banco de dados.

  • Privilégios para esquemas no banco de dados que contém a função de banco de dados.

  • Privilégios para objetos de esquema (tabelas, exibições, estágios, formatos de arquivo, UDFs e sequências) no banco de dados que contém a função de banco de dados.

Consulte também:

GRANT <privilégios> , GRANT OWNERSHIP

REVOKE <privilégio> … FROM SHARE

Sintaxe

Funções de conta:

REVOKE [ GRANT OPTION FOR ]
    {
       { globalPrivileges         | ALL [ PRIVILEGES ] } ON ACCOUNT
     | { accountObjectPrivileges  | ALL [ PRIVILEGES ] } ON { RESOURCE MONITOR | WAREHOUSE | DATABASE | INTEGRATION } <object_name>
     | { schemaPrivileges         | ALL [ PRIVILEGES ] } ON { SCHEMA <schema_name> | ALL SCHEMAS IN DATABASE <db_name> }
     | { schemaPrivileges         | ALL [ PRIVILEGES ] } ON { FUTURE SCHEMAS IN DATABASE <db_name> }
     | { schemaObjectPrivileges   | ALL [ PRIVILEGES ] } ON { <object_type> <object_name> | ALL <object_type_plural> IN SCHEMA <schema_name> }
     | { schemaObjectPrivileges   | ALL [ PRIVILEGES ] } ON FUTURE <object_type_plural> IN { DATABASE <db_name> | SCHEMA <schema_name> }
    }
  FROM [ ROLE ] <role_name> [ RESTRICT | CASCADE ]
Copy

Funções de banco de dados:

REVOKE [ GRANT OPTION FOR ]
    {
       { CREATE SCHEMA | MODIFY | MONITOR | USAGE } [ , ... ] } ON DATABASE <object_name>
       { globalPrivileges         | ALL [ PRIVILEGES ] } ON ACCOUNT
     | { accountObjectPrivileges  | ALL [ PRIVILEGES ] } ON { RESOURCE MONITOR | WAREHOUSE | DATABASE | INTEGRATION } <object_name>
     | { schemaPrivileges         | ALL [ PRIVILEGES ] } ON { SCHEMA <schema_name> | ALL SCHEMAS IN DATABASE <db_name> }
     | { schemaPrivileges         | ALL [ PRIVILEGES ] } ON { FUTURE SCHEMAS IN DATABASE <db_name> }
     | { schemaObjectPrivileges   | ALL [ PRIVILEGES ] } ON { <object_type> <object_name> | ALL <object_type_plural> IN SCHEMA <schema_name> }
     | { schemaObjectPrivileges   | ALL [ PRIVILEGES ] } ON FUTURE <object_type_plural> IN { DATABASE <db_name> | SCHEMA <schema_name> }
    }
  FROM DATABASE ROLE <database_role_name> [ RESTRICT | CASCADE ]
Copy

Onde:

globalPrivileges ::=
  {
     CREATE {
               ACCOUNT | DATA EXCHANGE LISTING | DATABASE | INTEGRATION
               | NETWORK POLICY | ROLE | SHARE | USER | WAREHOUSE
     }
     | APPLY MASKING POLICY | APPLY PASSWORD POLICY | APPLY ROW ACCESS POLICY | APPLY SESSION POLICY | ATTACH POLICY
     | EXECUTE ALERT | EXECUTE TASK | IMPORT SHARE | MANAGE GRANTS | MONITOR { EXECUTION | USAGE } | OVERRIDE SHARE RESTRICTIONS
  }
  [ , ... ]
Copy
accountObjectPrivileges ::=
-- For RESOURCE MONITOR
  { MODIFY | MONITOR } [ , ... ]
-- For WAREHOUSE
  { MODIFY | MONITOR | USAGE | OPERATE } [ , ... ]
-- For DATABASE
  { CREATE { DATABASE ROLE | SCHEMA } | IMPORTED PRIVILEGES | MODIFY | MONITOR | USAGE } [ , ... ]
-- For INTEGRATION
  { USAGE | USE_ANY_ROLE } [ , ... ]
Copy
schemaPrivileges ::=
  {
     MODIFY | MONITOR | USAGE
     | CREATE {
                 ALERT | EXTERNAL TABLE | FILE FORMAT | FUNCTION | MASKING POLICY |
                 MATERIALIZED VIEW | PASSWORD POLICY | PIPE | PROCEDURE | ROW ACCESS POLICY |
                 SECRET | SESSION POLICY | SEQUENCE | STAGE | STREAM | TAG | TABLE | TASK | VIEW
              }
     | ADD SEARCH OPTIMIZATION
  }
  [ , ... ]
Copy
schemaObjectPrivileges ::=
-- For TABLE
  { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES } [ , ... ]
-- For VIEW
  { SELECT | REFERENCES } [ , ... ]
-- For MATERIALIZED VIEW
  { SELECT | REFERENCES } [ , ... ]
-- For SEQUENCE, FUNCTION (UDF or external function), PROCEDURE, or FILE FORMAT
    USAGE
-- For internal STAGE
    READ [ , WRITE ]
-- For external STAGE
    USAGE
-- For PIPE
   { MONITOR | OPERATE } [ , ... ]
-- For STREAM
    SELECT
-- For TASK
   { MONITOR | OPERATE } [ , ... ]
-- For MASKING POLICY
    APPLY
-- For PASSWORD POLICY
    APPLY
-- For ROW ACCESS POLICY
    APPLY
-- For TAG
    APPLY
-- For ALERT
    OPERATE
-- For SECRET
    USAGE
Copy

Para obter mais detalhes sobre os privilégios suportados para cada tipo de objeto, consulte Privilégios de controle de acesso.

Parâmetros obrigatórios

object_name

Especifica o identificador do objeto no qual os privilégios são revogados.

object_type

Especifica o tipo de objeto (para objetos de esquema):

ALERT | EXTERNAL TABLE | FILE FORMAT | FUNCTION | MASKING POLICY | MATERIALIZED VIEW | PASSWORD POLICY | POLICY | PIPE | PROCEDURE | ROW ACCESS POLICY | SESSION POLICY | SEQUENCE | STAGE | STREAM | TABLE | TASK | VIEW

object_type_plural

Forma plural de object_type (por exemplo, TABLES, VIEWS).

role_name

Especifica o identificador da função do destinatário (ou seja, a função da qual os privilégios são revogados).

database_role_name

Especifica o identificador da função do banco de dados do destinatário (ou seja, a função da qual os privilégios são revogados). Se o identificador não estiver totalmente qualificado (na forma de db_name.database_role_name), o comando procura a função do banco de dados no banco de dados atual para a sessão.

Parâmetros opcionais

GRANT OPTION FOR

Se especificado, elimina a capacidade do destinatário de conceder os privilégios a outra função.

Padrão: sem valor

ON FUTURE

Se especificado, apenas remove privilégios concedidos em novos (ou seja, futuros) objetos de esquema de um tipo especificado (por exemplo, tabelas ou exibições) em vez de objetos existentes. Note que quaisquer privilégios concedidos para objetos existentes são retidos.

RESTRICT | CASCADE

Se especificado, determina se a operação de revogação é bem sucedida ou falha para os privilégios, com base no fato de os privilégios terem sido reatribuídos a outra função.

  • RESTRICT: se o privilégio que está sendo revogado foi novamente concedido a outra função, o comando REVOKE falha.

  • CASCADE: se o privilégio a ser revogado tiver sido revalidado, o comando REVOKE revoga recursivamente estas concessões dependentes. Se o mesmo privilégio em um objeto tiver sido concedido à função de destino por um concessor diferente (concessão paralela), essa concessão não será afetada e a função de destino manterá o privilégio.

Padrão: RESTRICT

Exigências de segurança

Revogação de privilégios em objetos individuais

Uma função ativa que atenda aos critérios a seguir, ou uma função superior, podem ser usadas para revogar os privilégios em um objeto de outras funções:

  • A função é identificada como concessora do privilégio na coluna GRANTED_BY na saída SHOW GRANTS.

    Se várias instâncias de um privilégio forem concedidas em um objeto específico, apenas as instâncias concedidas pela função do concessor ativo serão revogadas.

  • A função tem o privilégio global MANAGE GRANTS.

    Se várias instâncias de um privilégio forem concedidas em um objeto específico, todas as instâncias serão revogadas.

    Observe que somente a função do sistema SECURITYADMIN e superior têm o privilégio MANAGE GRANTS por padrão; no entanto, o privilégio pode ser concedido a outras funções personalizadas.

Em esquemas de acesso gerenciado (ou seja, esquemas criados usando a sintaxe CREATE SCHEMA … WITH MANAGED ACCESS), somente o proprietário do esquema (ou seja, a função com o privilégio OWNERSHIP para o esquema) ou uma função com o privilégio global MANAGE GRANTS podem revogar privilégios sobre objetos futuros no esquema.

Revogação de concessões em objetos futuros de um tipo específico

Nível do banco de dados

O privilégio global MANAGE GRANTS é necessário para revogar privilégios em objetos futuros em um banco de dados. Somente a função do sistema SECURITYADMIN e superior têm o privilégio MANAGE GRANTS; no entanto, o privilégio pode ser concedido a outras funções personalizadas.

Nível do esquema

Em esquemas de acesso gerenciado (ou seja, esquemas criados usando a sintaxe CREATE SCHEMA … WITH MANAGED ACCESS), o proprietário do esquema (ou seja, a função com o privilégio OWNERSHIP para o esquema) ou uma função com o privilégio global MANAGE GRANTS podem revogar privilégios sobre objetos futuros no esquema.

Em esquemas padrão, o privilégio global MANAGE GRANTS é necessário para revogar privilégios sobre objetos futuros no esquema.

Notas de uso

  • Um privilégio pode ser concedido a uma função várias vezes por concessores diferentes. Uma instrução REVOKE <privilege> só revoga concessões para os quais a função ativa, ou uma função inferior em uma hierarquia, é o concessor. Quaisquer concessões adicionais de um privilégio especificado por outros concessores são ignoradas.

    Observe também que uma instrução REVOKE <privilege> é bem-sucedida mesmo que nenhum privilégio seja revogado. Uma instrução REVOKE <privilege> só retorna um erro se um privilégio especificado tiver concessões dependentes e a cláusula CASCADE for omitida na instrução.

  • Vários privilégios podem ser especificados para o mesmo tipo de objeto em uma única instrução GRANT (com cada privilégio separado por vírgula), ou a palavra-chave especial ALL [ PRIVILEGES ] pode ser usada para conceder todos os privilégios aplicáveis ao tipo de objeto especificado. Observe, entretanto, que somente os privilégios detidos e concedíveis pela função que executa o comando GRANT são de fato concedidos à função de destino. Uma mensagem de advertência é gerada para quaisquer privilégios que não puderam ser concedidos.

  • Os privilégios concedidos a uma determinada função são automaticamente herdados por quaisquer outras funções às quais a função é concedida, bem como quaisquer outras funções de nível superior dentro da hierarquia de funções. Para obter mais detalhes, consulte Visão geral do controle de acesso.

  • Para bancos de dados, o privilégio IMPORTED PRIVILEGES só se aplica a bancos de dados compartilhados (ou seja, bancos de dados criados a partir de um compartilhamento). Para obter mais detalhes, consulte Consumidores de dados.

  • Para esquemas e objetos em esquemas, é fornecida uma opção para conceder privilégios para todos os objetos do mesmo tipo dentro do contêiner (ou seja, banco de dados ou esquema). Esta é uma opção de conveniência; internamente, o comando é expandido em uma série de comandos individuais GRANT em cada objeto. Somente os objetos que atualmente existem dentro do contêiner são afetados.

    Entretanto, observe que, no modelo Snowflake, a concessão de privilégios em massa não é uma prática recomendada. Em vez disso, o Snowflake recomenda criar uma função compartilhada e usar a função para criar objetos que são automaticamente acessíveis a todos os usuários a quem foi concedida a função.

  • Para estágios:

    • USAGE só se aplica a estágios externos.

    • READ | WRITE só se aplica a estágios internos. Além disso, para conceder o privilégio WRITE em um estágio interno, o privilégio READ deve primeiro ser concedido no estágio.

    Para obter mais detalhes sobre estágios externos e internos, consulte CREATE STAGE.

  • Ao conceder privilégios a um UDF individual, é preciso especificar os tipos de dados para os argumentos, se houver, para o UDF sob a forma de udf_name ( [ arg_data_type , ... ] ). Isto é necessário porque o Snowflake usa tipos de dados de argumentos para resolver UDFs que têm o mesmo nome dentro de um esquema. Para um exemplo, consulte Exemplos (neste tópico). Para obter mais detalhes, consulte Visão geral das funções definidas pelo usuário.

  • Ao conceder privilégios em um procedimento individual armazenado, você deverá especificar os tipos de dados para os argumentos, se houver, para o procedimento na forma de procedure_name ( [ arg_data_type , ... ] ). Isto é necessário porque o Snowflake usa tipos de dados de argumentos para resolver procedimentos armazenados que têm o mesmo nome dentro de um esquema.

  • Concessões futuras: Revogar concessões futuras só remove as concessões de privilégios para objetos futuros de um tipo especificado. Quaisquer privilégios concedidos para objetos existentes são mantidos.

    Para obter mais informações, consulte esquemas de acesso gerenciado.

Exemplos

Funções

Revogar os privilégios necessários para operar (ou seja, suspender ou retomar) o report_wh warehouse da função analyst:

REVOKE OPERATE ON WAREHOUSE report_wh FROM ROLE analyst;
Copy

Revogar somente a opção de concessão do privilégio OPERATE no report_wh warehouse da função analyst. A função retém o privilégio OPERATE, mas não pode mais conceder o privilégio OPERATE no warehouse a outras funções:

REVOKE GRANT OPTION FOR OPERATE ON WAREHOUSE report_wh FROM ROLE analyst;
Copy

Revogar o privilégio SELECT em todas as tabelas existentes no esquema mydb.myschema da função analyst:

REVOKE SELECT ON ALL TABLES IN SCHEMA mydb.myschema from ROLE analyst;
Copy

Revogar todos os privilégios em dois UDFs (com o mesmo nome no esquema atual) da função analyst:

REVOKE ALL PRIVILEGES ON FUNCTION add5(number) FROM ROLE analyst;

REVOKE ALL PRIVILEGES ON FUNCTION add5(string) FROM ROLE analyst;
Copy

Observe que os UDFs têm argumentos diferentes, que é como o Snowflake identifica exclusivamente UDFs com o mesmo nome. Para obter mais detalhes sobre a nomenclatura de UDF, consulte Visão geral das funções definidas pelo usuário.

Revogar todos os privilégios em dois procedimentos armazenados (com o mesmo nome no esquema atual) da função analyst:

REVOKE ALL PRIVILEGES ON PROCEDURE clean_schema(string) FROM ROLE analyst;

REVOKE ALL PRIVILEGES ON procedure clean_schema(string, string) FROM ROLE analyst;
Copy

Observe que os dois procedimentos armazenados têm argumentos diferentes, que é como o Snowflake identifica de forma única os procedimentos com o mesmo nome.

Revogar os privilégios SELECT e INSERT concedidos em todas as tabelas futuras criadas no esquema mydb.myschema da função role1:

REVOKE SELECT,INSERT ON FUTURE TABLES IN SCHEMA mydb.myschema
FROM ROLE role1;
Copy

Funções de banco de dados

Revogar o privilégio SELECT em todas as tabelas existentes no esquema mydb.myschema da função do banco de dados mydb.dr1:

REVOKE SELECT ON ALL TABLES IN SCHEMA mydb.myschema
  FROM DATABASE ROLE mydb.dr1;
Copy

Revogar todos os privilégios em dois UDFs (com o mesmo nome no esquema atual) da função do banco de dados mydb.dr1:

REVOKE ALL PRIVILEGES ON FUNCTION add5(number)
  FROM DATABASE ROLE mydb.dr1;

REVOKE ALL PRIVILEGES ON FUNCTION add5(string)
  FROM DATABASE ROLE mydb.dr1;
Copy

Observe que os UDFs têm argumentos diferentes, que é como o Snowflake identifica exclusivamente UDFs com o mesmo nome. Para obter mais detalhes sobre a nomenclatura de UDF, consulte Visão geral das funções definidas pelo usuário.

Revogar todos os privilégios em dois procedimentos armazenados (com o mesmo nome no esquema atual) da função de banco de dados mydb.dr1:

REVOKE ALL PRIVILEGES ON PROCEDURE clean_schema(string)
  FROM DATABASE ROLE mydb.dr1;

REVOKE ALL PRIVILEGES ON procedure clean_schema(string, string)
  FROM DATABASE ROLE mydb.dr1;
Copy

Observe que os dois procedimentos armazenados têm argumentos diferentes, que é como o Snowflake identifica de forma única os procedimentos com o mesmo nome.

Revogar os privilégios SELECT e INSERT concedidos em todas as tabelas futuras criadas no esquema mydb.myschema da função de banco de dados mydb.dr1:

REVOKE SELECT,INSERT ON FUTURE TABLES IN SCHEMA mydb.myschema
  FROM DATABASE ROLE mydb.dr1;
Copy