User-Defined Functions and Stored Procedures in Declarative Shared Native Applications¶
Declarative Native Apps can include stored procedures and user-defined functions (UDFs) to query, visualize, and explore the data. This topic describes how to include these logic objects in your app.
Funções definidas pelo usuário e procedimentos armazenados compatíveis¶
Você pode compartilhar os seguintes tipos de funções definidas pelo usuário (UDFs) e procedimentos armazenados (sprocs) em um Declarative Native App:
Stored procedures that have OWNERS RIGHTS or RESTRICTED CALLERS RIGHTS. For more information, see Understanding caller’s rights and owner’s rights stored procedures.
Todos os tipos de UDFs, exceto funções EXTERNAL
UDFs e procedimentos armazenados do Snowpark escritos em Python, Java, Javascript e Scala. Funções do Snowpark Container Services não são compatíveis.
Inclusão de funções definidas pelo usuário e procedimentos armazenados em seu aplicativo¶
Para incluir UDFs e procedimentos armazenados em seu Declarative Native App, adicione os nomes dos objetos e as respectivas permissões ao arquivo manifest.yaml. Você não precisa adicionar os objetos usando arquivos separados, como faz com os notebooks.
O exemplo a seguir mostra como incluir uma UDF e um procedimento armazenado no arquivo manifest.yaml:
manifest_version: 2
roles:
- ANALYST:
comment: "The ANALYST role provides access to logic objects."
shared_content:
databases:
- SNAF_POPULATION_DB:
schemas:
- LOGIC_SCHEMA:
roles: [ANALYST]
functions:
- POPULATION_ANALYSIS_FUNCTION(NUMBER):
roles: [ANALYST]
procedures:
- POPULATION_ANALYSIS_PROCEDURE():
roles: [ANALYST]
Neste exemplo, a UDF POPULATION_ANALYSIS_FUNCTION e o procedimento armazenado POPULATION_ANALYSIS_PROCEDURE estão incluídos no arquivo manifest.yaml. A função ANALYST do app recebe acesso a ambos os objetos.
Acesso a objetos privados (não compartilhados) usando UDFs e procedimentos armazenados¶
Você pode usar UDFs e procedimentos armazenados para acessar tabelas e exibições privadas (não compartilhadas). Por exemplo, seu banco de dados pode ter uma exibição que não fique visível aos consumidores, mas os consumidores podem usar um procedimento armazenado para recuperar os dados dessa exibição.
Para permitir que os clientes acessem objetos privados usando UDFs e procedimentos armazenados, marque o objeto com a palavra-chave private: true no arquivo manifest.yaml.
O exemplo a seguir mostra como permitir que um procedimento armazenado acesse uma tabela privada no arquivo manifest.yaml:
manifest_version: 2
roles:
- VIEWER:
comment: "The VIEWER role can access a stored procedure that retrieves data from a view, but not the underlying view."
shared_content:
databases:
- SNAF_POPULATION_DB:
schemas:
- DATA_SCHEMA:
views: # This view is private as no roles are granted
- COUNTRY_POP_BY_YEAR_2000:
private: true
- LOGIC_SCHEMA:
roles: [VIEWER]
procedures:
- POPULATION_DISPLAY_PROCEDURE():
roles: [VIEWER]
No exemplo anterior, a exibição COUNTRY_POP_BY_YEAR_2000 é privada porque nenhuma função recebeu acesso a ela, mas o parâmetro private permite que objetos lógicos a acessem. A função VIEWER do app pode executar o procedimento armazenado, mas não pode consultar a exibição privada diretamente. Observe que as tabelas às quais a exibição COUNTRY_POP_BY_YEAR_2000 faz referência não precisam ser incluídas no arquivo manifest.yaml para que a exibição as acesse.
Limitações¶
- Linguagens e tipos compatíveis
Snowpark UDFs and stored procedures written in Python, Java, Javascript, and Scala. Snowpark Container Service functions are not supported.
- Esquemas para objetos de dados e lógicos
Você deve usar esquemas separados para objetos de dados (tabelas e exibições) e objetos lógicos (UDFs e procedimentos armazenados). Por exemplo, você pode usar um esquema chamado
DATA_SCHEMApara tabelas e exibições, e um esquema chamadoLOGIC_SCHEMApara UDFs e procedimentos armazenados.- Referência a objetos privados
As UDFs e os procedimentos armazenados devem fazer referência a objetos privados pelos respectivos nomes qualificados. Os objetos lógicos não podem fazer referência a objetos privados pelos nomes totalmente qualificados.
- Contagem de objetos
Um Declarative Native App pode incluir até 100 UDFs e procedimentos armazenados. Para aumentar esse limite, entre em contato com o suporte Snowflake.
- Tabelas dinâmicas
A referência a tabelas dinâmicas em UDFs e procedimentos armazenados não é permitida.