Práticas de segurança para UDFs e procedimentos

Este tópico descreve as práticas recomendadas para escrever funções seguras definidas pelo usuário (UDFs) e procedimentos.

Neste tópico:

Práticas para manipuladores de UDF

Sua função ou método (e qualquer função ou métodos de biblioteca que você chamar) deve agir como uma função pura, agindo somente sobre os dados que recebe e retornando um valor baseado nesses dados, sem causar efeitos colaterais. Seu código não deve tentar afetar o estado do sistema subjacente, a não ser consumir uma quantidade razoável de memória e tempo de processador.

Práticas de procedimento e manipuladores de UDF

O código do manipulador é executado dentro de um mecanismo restrito. Nem seu código nem o código nos métodos de biblioteca que você utiliza devem empregar quaisquer chamadas de sistema proibidas, inclusive:

  • Controle de processo. Por exemplo, você não pode bifurcar um processo. (Entretanto, você pode usar threads múltiplos).

  • Acesso ao sistema de arquivo no qual o manipulador está sendo executado.

    Com as seguintes exceções, o manipulador não deve ler ou escrever arquivos:

    • Um manipulador pode ler arquivos preparados especificados na cláusula IMPORTS. Para obter mais informações, consulte CREATE FUNCTION ou CREATE PROCEDURE.

    • Um manipulador pode escrever arquivos, tais como arquivos de log, no diretório /tmp.

      Cada consulta recebe seu próprio sistema de arquivo com memória, no qual seu próprio /tmp é armazenado, de modo que consultas diferentes não podem ter conflitos de nome de arquivo.

      Entretanto, conflitos dentro de uma consulta são possíveis se uma única consulta chamar mais de uma UDF e essas UDFs tentarem escrever no mesmo nome de arquivo.

      Nota

      Além disso, como UDFs de Python podem ser executadas em processos separados de trabalhadores paralelamente, você deve ter cuidado ao escrever no diretório /tmp.

      Para saber mais sobre como escrever arquivos, consulte Como escrever arquivos. Para obter um exemplo, consulte Como descompactar um arquivo preparado.

  • Acesso à rede.

    Você não pode usar um gerenciador para criar soquetes, mas pode usar um gerenciador para acessar recursos em uma rede externa.

    Nota

    Você não pode usar o código no driver JDBC do Snowflake para acessar o banco de dados. Sua UDF em si não pode agir como cliente do Snowflake.

Para manipuladores em Java ou Scala

  • O uso de JNI (Java Native Interface) não é suportado. O Snowflake proíbe o carregamento de bibliotecas que contenham código nativo (ao contrário de código de bytes de Java).

  • Quando usado dentro de uma região do governo, UDFs de Java oferecem suporte para algoritmos de criptografia que são validados para atender aos requisitos do padrão Federal Information Processing Standard (140-2) (FIPS 140-2). Somente podem ser usados algoritmos criptográficos que são permitidos no modo aprovado pelo FIPS da API de criptografia BouncyCastle para Java. Para obter mais informações sobre o FIPS 140-2, consulte FIPS 140-2.