Como usar referências para autorizar acesso a objetos

Uma referência pode ser usada para autorizar o acesso a objetos para um procedimento armazenado, aplicativo ou instância de classe que não tenha acesso a esses objetos por padrão.

Neste tópico:

Introdução

Uma referência é uma cadeia de caracteres que pode ser usada como identificador. O identificador é resolvido para o objeto que está sendo referenciado.

Uma referência encapsula o seguinte:

  • O nome do objeto.

  • A função ativa usada para criar a referência do objeto e quaisquer funções secundárias ativas, se aplicável.

  • O(s) privilégio(s) no objeto especificado(s) quando a referência é criada.

Alguns cenários em que uma referência pode ser necessária incluem:

  • Um procedimento armazenado com direitos de proprietário exige acesso para inserir dados em uma tabela pertencente a uma função diferente.

  • Um aplicativo executa análise de dados e exige acesso de leitura aos dados em tabelas.

  • Uma instância da classe SNOWFLAKE.ML.ANOMALY_DETECTION exige acesso de leitura a uma exibição para treinar o modelo de detecção de anomalias ML.

Objetos identificados pelo nome

Uma referência identifica um objeto pelo nome. Isso significa que se um objeto for renomeado após a criação de uma referência, a referência será inválida. Porém, se um novo objeto com o mesmo nome for criado, a referência pode ser válida. Por exemplo, uma função my_role cria uma referência my_ref1 para a tabela my_table1 com o privilégio SELECT. Após a criação da referência, a tabela my_table1 é descartada e uma nova tabela chamada my_table1 é criada. A referência my_ref1 identifica uma tabela com o nome my_table1. Neste caso, identifica a nova tabela my_table1.

Se a função usada para criar a referência e os privilégios concedidos em my_table1 ainda forem válidos, o acesso à my_table1 nova será autorizado ao usar a referência.

Se a função e o(s) privilégio(s) encapsulado(s) na referência não forem mais válidos, o acesso à tabela my_table1 não poderá ser autorizado e uma nova referência deverá ser criada para a nova tabela.

Privilégios verificados em tempo de execução

Os privilégios concedidos à função que criou a referência são verificados no momento em que a referência é utilizada. Por exemplo, uma função my_role cria uma referência a uma tabela t1 com o privilégio SELECT. Se my_role for descartado ou o privilégio SELECT na tabela t1 for revogado de my_role, os privilégios encapsulados na referência não serão mais válidos. Quando a referência é passada para um procedimento armazenado que exige o privilégio SELECT na tabela, o procedimento armazenado falha com um erro de permissão.

Tipos de referências e vida útil da referência

A vida útil de uma referência pode ser especificada no momento da criação.

  • Uma referência transitória tem uma vida útil limitada, seja pela duração da chamada na qual a referência é passada ou pela duração da sessão.

  • Uma referência persistente tem vida útil ilimitada. A referência permanece válida até que o objeto ao qual ela faz referência seja descartado, a referência seja desativada ou a referência se torne inválida.

    Para obter exemplos de cancelamento de referências, consulte Desativação de uma referência persistente para um aplicativo.

    Uma referência pode tornar-se inválida por qualquer um dos seguintes motivos:

    • O objeto ao qual ele faz referência é renomeado.

    • A função que criou a referência é descartada.

    • A função que criou a referência não possui mais privilégios no objeto.

    Para obter mais informações, consulte Objetos identificados pelo nome e Privilégios verificados em tempo de execução.

Referências para procedimentos armazenados de direitos do proprietário

Um procedimento armazenado com direitos do proprietário é executado com os privilégios do proprietário em vez dos privilégios do chamador que executa o procedimento armazenado. Para executar ações em uma tabela, exibição ou função que o chamador tenha privilégios de acesso, o chamador deve passar uma referência à tabela, exibição ou função. A referência permite que o procedimento armazenado execute ações no objeto que a referência identifica com os privilégios do criador da referência (nesse caso, o chamador).

Referências para aplicativos e classes

Por projeto, aplicativos e classes não têm acesso a objetos na conta onde o aplicativo está instalado ou onde uma instância de uma classe é criada. Os usuários podem autorizar o acesso a objetos para um aplicativo ou instância de classe criando uma referência.

Provedores e consumidores de aplicativos e classes

Um provedor cria um aplicativo e um consumidor instala e usa um aplicativo na conta do consumidor. No caso de Classes Snowflake, Snowflake é o provedor, e um usuário com uma conta Snowflake que cria uma instância de uma classe é o consumidor.

Os provedores podem criar aplicativos e classes que solicitam e usam referências em seu código. Para obter mais informações, consulte Referências para provedores.

Os consumidores podem criar e passar referências aos aplicativos que instalam em suas contas ou a instâncias de classes Snowflake. Para obter mais informações, consulte Referências para consumidores.

Alvos suportados para referências

Os alvos de uma referência podem ser um objeto ou uma consulta. Se o alvo da referência for um objeto, serão necessários privilégios no objeto para a referência.

Tipos de objetos e privilégios suportados para referências

A tabela a seguir lista os tipos de objeto que uma referência pode incluir, o tipo de referência que pode ser criado e os privilégios permitidos para cada objeto:

Tipo de objeto

Transitória

Persistente

Privilégios permitidos

Privilégio padrão

DATABASE

APPLYBUDGET

SCHEMA

APPLYBUDGET

TABLE

APPLYBUDGET

SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES

SELECT

VIEW

SELECT, REFERENCES

SELECT

MATERIALIZED VIEW

APPLYBUDGET

EXTERNAL TABLE

SELECT, REFERENCES

SELECT

PIPE

APPLYBUDGET

APPLYBUDGET

TASK

APPLYBUDGET

APPLYBUDGET

FUNCTION

USAGE

USAGE

PROCEDURE

USAGE

USAGE

WAREHOUSE

APPLYBUDGET

MODIFY, MONITOR, OPERATE, USAGE

USAGE

API INTEGRATION

USAGE

USAGE

Referências de consulta

Uma referência de consulta é um tipo de referência transitória. Ela faz referência a uma instrução SELECT que pode ser usada na cláusula FROM de outra instrução SQL em um procedimento armazenado. Você pode criar uma referência de consulta usando a função SYSTEM$QUERY_REFERENCE.

Para obter mais informações, consulte Uso de referências de consulta.

Referências para provedores

Você pode criar aplicativos como um provedor usando o Snowflake Native App Framework. Para obter informações detalhadas sobre como solicitar referências de um consumidor do seu aplicativo, consulte Solicitação de referências e privilégios de nível de objeto de consumidores.

Referências para consumidores

Você pode criar uma referência usando a função SYSTEM$REFERENCE. Você pode passar o identificador da cadeia de caracteres que a função retorna para um procedimento armazenado, aplicativo ou instância de classe. Como alternativa, você pode passar a instrução que cria a referência no lugar do identificador da cadeia de caracteres.

Exemplos

Crie uma referência transitória com escopo de sessão para a tabela t1 com o privilégio SELECT:

SELECT SYSTEM$REFERENCE('TABLE', 't1', 'SESSION', 'SELECT');
Copy

Para criar uma referência à mesma tabela durante a existência do escopo no qual ela é referenciada (por exemplo, se você passá-la para um procedimento armazenado, seu tempo de vida seria o do bloco mais externo do procedimento armazenado), execute o seguinte instrução:

SELECT SYSTEM$REFERENCE('TABLE', 't1', 'CALL', 'SELECT');
Copy

Crie uma referência persistente para uma tabela t1 com o privilégio INSERT para passar para um aplicativo:

SELECT SYSTEM$REFERENCE('TABLE', 't1', 'PERSISTENT', 'INSERT');
Copy

Crie uma referência de consulta para passar para um procedimento armazenado. O tempo de vida dessa referência transitória é para o bloco mais externo do procedimento armazenado para o qual você passa a referência:

SELECT SYSTEM$QUERY_REFERENCE('SELECT id FROM my_table', FALSE);
Copy

Para mais exemplos:

Desativação de uma referência persistente para um aplicativo

Um aplicativo ou classe que exige uma referência persistente também fornecerá um método para remover a definição da referência. Os nomes dos métodos podem variar de acordo com a implementação.

Como alternativa, você pode cancelar a definição de referências usando uma instrução ALTER APPLICATION … UNSET REFERENCES.

  1. Você pode usar o comando SHOW REFERENCES para visualizar todas as referências, incluindo referências que foram definidas para um aplicativo.

    Por exemplo, para visualizar referências do aplicativo my_app:

    SHOW REFERENCES IN APPLICATION my_app;
    
    Copy
  2. Você pode cancelar a definição de quaisquer referências que tenham sido definidas para o aplicativo usando o comando ALTER APPLICATION.

    Por exemplo, para remover a definição da referência denominada table_to_read no aplicativo my_app:

    ALTER APPLICATION my_app UNSET REFERENCES('table_to_read');
    
    Copy

    Por exemplo, para cancelar a definição de todas as referências no aplicativo my_app:

    ALTER APPLICATION my_app UNSET REFERENCES;
    
    Copy

Considerações ao usar referências

  • Se um objeto associado a uma referência for renomeado (ou tiver um outro pai), a referência não será mais válida.

    Se um novo objeto for criado com o mesmo nome e se as funções codificadas na associação de referência tiverem os privilégios relevantes no novo objeto, a referência permanecerá válida. Caso contrário, falhará com um erro de permissão.

  • Se um objeto for trocado e as funções codificadas na associação de referência tiverem os privilégios relevantes no novo objeto que agora possui o nome trocado, a referência permanecerá válida. Caso contrário, falhará com um erro de permissão.

  • Descarte e cancelamento de descarte do objeto:

    • Se um objeto associado a uma referência for descartado, a associação de referência se tornará inválida.

    • Se o descarte do objeto for cancelado, a associação de referência se tornará válida novamente.

  • Clonagem

    Você pode clonar uma instância de classe, ou seu banco de dados ou esquema pai, que usa referências a objetos em sua conta.

    • Se o objeto de referência for referenciado com um nome completo, o clone da instância fará referência ao objeto original.

    • Se o objeto referenciado for referenciado com um nome parcialmente qualificado ou não qualificado, o clone da instância poderá referir-se ao objeto clone, ao objeto original ou a nenhum objeto real, dependendo do limite de clonagem.

  • A replicação tem suporte para um aplicativo ou banco de dados que contém uma instância de classe que usa uma referência a objetos na conta do consumidor.

    As referências funcionam corretamente na conta de destino, desde que os seguintes objetos sejam replicados:

    • Instância de classe ou aplicativo.

    • Objeto referenciado.

    • Função que criou a referência.

    Esses objetos podem ser replicados em diferentes grupos de replicação ou failover. Depois que todos os objetos forem replicados, a referência poderá ser usada.

Para provedores de aplicativos Snowflake Native App Framework, consulte também Considerações ao usar referências.

Monitoramento do uso de referências

Você pode visualizar referências solicitadas por um aplicativo usando o comando SHOW REFERENCES. Se você tiver definido alguma referência para um aplicativo, a saída incluirá informações sobre o objeto, o banco de dados, o esquema e o identificador de cada referência.

Por exemplo, para visualizar referências no aplicativo my_app:

SHOW REFERENCES IN APPLICATION my_app;
Copy