EXECUTE IMMEDIATE FROM

EXECUTE IMMEDIATE FROM executa as instruções SQL especificadas em um arquivo em um estágio. O arquivo pode conter instruções SQL ou blocos do Script Snowflake. As instruções devem ser instruções SQL sintaticamente corretas.

Você pode usar o comando EXECUTE IMMEDIATE FROM para executar as instruções em um arquivo de qualquer sessão do Snowflake.

Esse recurso fornece um mecanismo para controlar a implantação e o gerenciamento de objetos e códigos do Snowflake. Por exemplo, você pode executar um script armazenado para criar um ambiente Snowflake padrão para todas as suas contas. O script de configuração pode incluir instruções que criam usuários, funções, bancos de dados e esquemas para cada nova conta.

Consulte também:

EXECUTE IMMEDIATE

Sintaxe

EXECUTE IMMEDIATE
  FROM { absoluteFilePath | relativeFilePath }
Copy

Onde:

absoluteFilePath ::=
   @[ <namespace>. ]<stage_name>/<path>/<filename>
Copy
relativeFilePath ::=
  '[ { ./ | / | { ../ [ , ../, ... ] } } ]<path>/<filename>'
Copy

Caminho absoluto do arquivo (absoluteFilePath)

namespace

Banco de dados e/ou esquema no qual está o estágio interno ou externo, na forma de database_name.schema_name ou schema_name. O namespace é opcional se um banco de dados e esquema estiverem em uso atualmente para a sessão do usuário; caso contrário, ele é obrigatório.

stage_name

Nome do estágio interno ou externo.

path

Caminho que diferencia maiúsculas de minúsculas para o arquivo no estágio.

filename

Nome do arquivo a ser executado. Deve conter instruções SQL sintaticamente corretas e válidas. Cada instrução deve ser separada por ponto e vírgula.

Caminho relativo do arquivo (relativeFilePath)

path

Caminho relativo que diferencia maiúsculas de minúsculas para o arquivo no estágio. Caminhos relativos oferecem suporte a convenções estabelecidas, como um / inicial para indicar a raiz do sistema de arquivos de um estágio, ./ para se referir ao diretório atual (o diretório no qual o arquivo pai está localizado) e ../ para se referir ao diretório pai. Para obter mais informações, consulte Notas de uso.

filename

Nome do arquivo a ser executado. Deve conter instruções SQL sintaticamente corretas e válidas. Cada instrução deve ser separada por ponto e vírgula.

Retornos

EXECUTE IMMEDIATE FROM retorna:

  • O resultado da última instrução no arquivo se todas as instruções forem executadas com sucesso.

  • A mensagem de erro, se alguma instrução no arquivo falhar.

    Se houver um erro em qualquer instrução do arquivo, o comando EXECUTE IMMEDIATE FROM falhará e retornará a mensagem de erro da instrução com falha.

    Nota

    Se o comando EXECUTE IMMEDIATE FROM falhar e retornar uma mensagem de erro, todas as instruções no arquivo anteriores à instrução com falha foram concluídas com êxito.

Requisitos de controle de acesso

  • A função usada para executar o comando EXECUTE IMMEDIATE FROM deve ter o privilégio USAGE (estágio externo) ou READ (estágio interno) no estágio onde o arquivo está localizado.

  • A função usada para executar o arquivo só pode executar as instruções do arquivo para as quais possui privilégios. Por exemplo, se houver uma instrução CREATE TABLE no arquivo, a função deverá ter os privilégios necessários para criar uma tabela na conta ou a instrução falhará.

Observe que operar em qualquer objeto de um esquema também requer o privilégio USAGE no banco de dados e esquema principais.

Para instruções sobre como criar uma função personalizada com um conjunto específico de privilégios, consulte Criação de funções personalizadas.

Para informações gerais sobre concessões de funções e privilégios para executar ações de SQL em objetos protegíveis, consulte Visão geral do controle de acesso.

Notas de uso

  • As instruções SQL em um arquivo a ser executado podem incluir instruções EXECUTE IMMEDIATE FROM:

    • Instruções EXECUTE IMMEDIATE FROM aninhadas podem usar caminhos de arquivo relativos.

      Os caminhos relativos são avaliados em relação ao estágio e ao caminho do arquivo pai. Se o caminho relativo do arquivo começar com /, o caminho começará no diretório raiz do estágio que contém o arquivo pai.

      Para obter um exemplo, consulte Exemplos.

    • Caminhos de arquivos relativos devem obrigatoriamente ser colocados entre aspas simples (') ou $$.

    • A profundidade máxima de execução para arquivos aninhados é 5.

  • Caminhos de arquivo absolutos podem opcionalmente ser colocados entre aspas simples (') ou $$.

  • O arquivo a ser executado não pode ter tamanho maior que 10MB.

  • O arquivo a ser executado deve estar codificado em UTF-8.

  • O arquivo a ser executado deve estar descompactado. Se você usar o comando PUT para carregar um arquivo para um estágio interno, deverá definir explicitamente o parâmetro AUTO_COMPRESS como FALSE.

    Por exemplo, carregue my_file.sql para my_stage:

    PUT file://~/sql/scripts/my_file.sql @my_stage/scripts/
      AUTO_COMPRESS=FALSE;
    
    Copy
  • A execução de todos os arquivos em um diretório não é suportada. Por exemplo, EXECUTE IMMEDIATE FROM @stage_name/scripts/ resulta em um erro.

Solução de problemas de EXECUTE IMMEDIATE FROM

Esta seção contém alguns erros comuns que resultam de uma instrução EXECUTE IMMEDIATE FROM e como você pode resolvê-los.

Erros de arquivo

Erro

001501 (02000): File '<directory_name>' not found in stage '<stage_name>'.

Causa

Existem várias causas para este erro:

  • O arquivo não existe.

  • O nome do arquivo é a raiz de um diretório. Por exemplo @stage_name/scripts/.

Solução

Verifique o nome do arquivo e confirme se ele existe. A execução de todos os arquivos em um diretório não é suportada.

Erro

001503 (42601): Relative file references like '<filename.sql>' cannot be used in top-level EXECUTE IMMEDIATE calls.

Causa

A instrução foi executada usando um caminho de arquivo relativo fora de uma execução de arquivo.

Solução

Um caminho de arquivo relativo só pode ser usado em instruções EXECUTE IMMEDIATE FROM em um arquivo. Use o caminho absoluto do arquivo para o arquivo. Para obter mais informações, consulte Notas de uso.

Erro

001003 (42000): SQL compilation error: syntax error line <n> at position <m> unexpected '<string>'.

Causa

O arquivo contém erros de sintaxe SQL.

Solução

Corrija os erros de sintaxe no arquivo e reenvie o arquivo para o estágio.

Erros de estágio

Erro

002003 (02000): SQL compilation error: Stage '<stage_name>' does not exist or not authorized.

Causa

O estágio não existe ou você não tem acesso ao estágio.

Solução

  • Verifique o nome do estágio e confirme se ele existe.

  • Execute a instrução usando uma função que tenha os privilégios necessários para acessar o estágio. Para obter mais informações, consulte Requisitos de controle de acesso.

Erros de controle de acesso

Erro

003001 (42501): Uncaught exception of type 'STATEMENT_ERROR' in file <file_name> on line <n> at position <m>:
SQL access control error: Insufficient privileges to operate on schema '<schema_name>'

Causa

A função usada para executar a instrução não possui os privilégios necessários para executar algumas ou todas as instruções no arquivo.

Solução

Use uma função que tenha os privilégios apropriados para executar as instruções no arquivo. Para obter mais informações, consulte Requisitos de controle de acesso.

Consulte também: Erros de estágio.

Exemplos

Este exemplo executa o arquivo create-inventory.sql localizado no estágio my_stage.

  1. Crie um arquivo denominado create-inventory.sql com as seguintes instruções:

    CREATE OR REPLACE TABLE my_inventory(
      sku VARCHAR,
      price NUMBER
    );
    
    EXECUTE IMMEDIATE FROM './insert-inventory.sql';
    
    SELECT sku, price
      FROM my_inventory
      ORDER BY price DESC;
    
    Copy
  2. Crie um arquivo denominado insert-inventory.sql com as seguintes instruções:

    INSERT INTO my_inventory
      VALUES ('XYZ12345', 10.00),
             ('XYZ81974', 50.00),
             ('XYZ34985', 30.00),
             ('XYZ15324', 15.00);
    
    Copy
  3. Crie um estágio interno my_stage:

    CREATE STAGE my_stage;
    
    Copy
  4. Carregue dois arquivos locais para o estágio usando o comando PUT:

    PUT file://~/sql/scripts/create-inventory.sql @my_stage/scripts/
      AUTO_COMPRESS=FALSE;
    
    PUT file://~/sql/scripts/insert-inventory.sql @my_stage/scripts/
      AUTO_COMPRESS=FALSE;
    
    Copy
  5. Execute o script create-inventory.sql localizado em my_stage:

    EXECUTE IMMEDIATE FROM @my_stage/scripts/create-inventory.sql;
    
    Copy

    Retorna:

    +----------+-------+
    | SKU      | PRICE |
    |----------+-------|
    | XYZ81974 |    50 |
    | XYZ34985 |    30 |
    | XYZ15324 |    15 |
    | XYZ12345 |    10 |
    +----------+-------+