Snowpark Container Services: execução de SQL¶
O contêiner do aplicativo pode se conectar ao Snowflake e executar SQL. Este tópico descreve como o código do contêiner obtém as informações necessárias para se conectar ao Snowflake, incluindo as credenciais de autenticação, o contexto de banco de dados e esquema do serviço e o warehouse usado para executar as instruções SQL.
Opções de configuração de credenciais¶
A Snowflake recomenda que os contêineres de aplicativo usem credenciais fornecidas pelo Snowflake para autenticação no Snowflake ao executar SQL. É possível usar outras credenciais conectando-se por meio de uma integração de acesso externo (External Access Integration, EAI), mas a conexão por meio de uma EAI considera que o serviço está sendo executado fora do Snowflake e usa uma conexão de internet para se conectar ao Snowflake.
Você tem três opções para se conectar ao Snowflake de um contêiner de serviço:
Usar as credenciais de usuário de serviço fornecidas pelo Snowflake: o Snowflake fornece a cada serviço credenciais chamadas de «credenciais de serviço». Um serviço usa essas credenciais para se conectar ao Snowflake como usuário do serviço.
Usar as credenciais de autor da chamada fornecidas pelo Snowflake (direitos do autor da chamada): quando você configura seu serviço com direitos do autor da chamada, o Snowflake também fornece credenciais para que o serviço se conecte ao Snowflake como o usuário que faz a chamada.
Usar outras credenciais: nesse caso, você usa uma integração de acesso externo (EAI) que permite que seu serviço se conecte ao ponto de extremidade de internet do Snowflake usando credenciais de autenticação válidas. Essa opção requer que um administrador crie a EAI e, em seguida, conceda o privilégio USAGE na integração à função de proprietário do serviço.
Nota
Se você usar integrações de acesso externo para acessar o Snowflake, poderá enviar informações potencialmente confidenciais pela Internet.
Para obter exemplos de código que usa vários drivers do Snowflake para se conectar ao Snowflake, consulte Amostras de conexão com o Snowflake.
Usando as credenciais de usuário do serviço fornecidas pelo Snowflake¶
Ao usar credenciais de serviço fornecidas pelo Snowflake, esteja ciente dos seguintes efeitos:
Cada objeto no Snowflake tem uma função de proprietário, que é aquela usada para criar o objeto. A função de proprietário de um serviço determina os recursos que o serviço tem permissão para interagir com o Snowflake. Esses recursos incluem a execução de SQL, o acesso a áreas de preparação e a criação de rede entre serviços.
Quando você cria um serviço, o Snowflake também cria um usuário específico para esse serviço. O usuário do serviço tem acesso apenas a duas funções: de proprietário do serviço e PUBLIC. A função padrão do usuário do serviço é a de proprietário do serviço.
Quando você inicia um serviço, como serviços de trabalho, o Snowflake executa várias ações. Em cada um dos contêineres de aplicativo, o Snowflake permite que o código do contêiner use drivers para conexão com o Snowflake e execução do SQL, o que é semelhante a qualquer outro código no seu computador que conecta ao Snowflake. A lista a seguir mostra as ações que o Snowflake executa quando você inicia um serviço:
Fornece credenciais (um token OAuth) no contêiner em um arquivo chamado
/snowflake/session/token. O código do contêiner usa essas credenciais para autenticação como o usuário do serviço. Esse token OAuth não pode ser usado fora do Snowpark Container Services.Define as seguintes variáveis de ambiente para você configurar um cliente Snowflake em seu código de serviço:
SNOWFLAKE_ACCOUNT: essa variável é definida como o localizador da conta Snowflake na qual o serviço está sendo executado.
SNOWFLAKE_HOST: essa variável fornece o nome de host usado para conectar ao Snowflake.
Quando você cria uma conexão com o Snowflake como usuário do serviço, o código do contêiner deve usar SNOWFLAKE_HOST, SNOWFLAKE_ACCOUNT e o token OAuth. O token OAuth não pode ser usado sem também usar SNOWFLAKE_HOST.
Exemplo
Em Tutorial 2 (consulte main.py), o código lê as variáveis de ambiente conforme mostrado no exemplo a seguir:
SNOWFLAKE_ACCOUNT = os.getenv('SNOWFLAKE_ACCOUNT')
SNOWFLAKE_HOST = os.getenv('SNOWFLAKE_HOST')
O código passa essas variáveis para um código de criação de conexão para o cliente Snowflake de sua escolha. O contêiner usa essas credenciais para criar uma nova sessão, com a função de proprietário do serviço como a função principal da sessão, para executar consultas. O exemplo a seguir é o código mínimo necessário para criar uma conexão com o Snowflake em Python:
def get_login_token():
with open('/snowflake/session/token', 'r') as f:
return f.read()
conn = snowflake.connector.connect(
host = os.getenv('SNOWFLAKE_HOST'),
account = os.getenv('SNOWFLAKE_ACCOUNT'),
token = get_login_token(),
authenticator = 'oauth'
)
Observe os seguintes detalhes sobre o token OAuth:
O Snowflake atualiza o conteúdo do arquivo
/snowflake/session/tokena cada poucos minutos. Cada token é válido por até uma hora. Depois que um contêiner se conecta ao Snowflake com êxito, o tempo de expiração não se aplica à conexão, como acontece com qualquer sessão criada diretamente pelos usuários.Este token OAuth é válido apenas no serviço específico do Snowflake. Não é possível copiar o token OAuth e usá-lo fora do serviço.
Se você usar o token OAuth para se conectar, ele criará uma nova sessão. O token OAuth não está associado a nenhuma sessão SQL existente.
Nota
Uma diferença significativa entre a execução de procedimentos armazenados e a execução de um serviço é que os procedimentos armazenados são executados na mesma sessão que o SQL que os executa. Mas toda vez que um contêiner estabelece uma nova conexão, você cria uma nova sessão.
Para visualizar as consultas emitidas por um usuário de serviço específico, você pode usar a função ACCOUNTADMIN para visualizar o histórico de consultas. O nome de usuário do usuário de serviço aparece nos seguintes formatos:
Para um serviço criado antes do lançamento do servidor 8.35, o nome de usuário do serviço tem o formato
SF$SERVICE$unique-id.Para um serviço criado após o lançamento do servidor 8.35, o nome de usuário do serviço é o mesmo que o nome do serviço.
Nota
A função de proprietário do serviço é a que criou o serviço. Você pode definir uma ou mais funções de serviço para gerenciar o acesso aos pontos de extremidade que o serviço expõe. Para obter mais informações, consulte Gerenciar privilégios relacionados ao serviço.
Sobre o uso das credenciais de autor da chamada fornecidas pelo Snowflake (direitos do autor da chamada)¶
Em determinados cenários de aplicativos, talvez seja necessário executar consultas usando o contexto do usuário final em vez do usuário do serviço, conforme explicado na seção anterior. O recurso de direito do autor da chamada é usado nesse contexto.
Por exemplo, suponha que você crie um serviço que expõe um ponto de extremidade público para um aplicativo da web que exibe um painel que usa os dados armazenados no Snowflake. Você concede a outros usuários da sua conta Snowflake acesso ao painel atribuindo a eles a função de serviço. Quando um usuário faz login, o painel exibe somente os dados que ele está autorizado a acessar.
No entanto, como os contêineres, por padrão, executam consultas usando o usuário do serviço e a função de proprietário do serviço, o painel mostra os dados aos quais a função de proprietário do serviço tem acesso, seja qual for o usuário final conectado ao ponto de extremidade. Como resultado, o painel não se limita aos dados que o usuário final está autorizado a acessar, permitindo que o usuário que fez login veja dados aos quais não deveria ter acesso.
Para limitar o painel a mostrar apenas os dados acessíveis ao usuário que fez login, os contêineres de aplicativo devem executar SQL usando os privilégios concedidos ao usuário final. Você pode ativar isso usando os direitos do chamador no aplicativo.
Nota
O recurso de direitos do chamador é suportado somente quando acessa um serviço usando o ingresso na rede. O recurso não está disponível ao usar uma função de serviço para acessar o serviço.
No momento, o recurso de direitos do chamador não é compatível com Snowflake Native App (aplicativos com contêineres).
Configurar direitos do autor da chamada para seu serviço¶
A configuração dos direitos do autor da chamada para seu aplicativo é um procedimento de duas etapas.
Na especificação do serviço, defina
executeAsCallercomotrue, conforme mostrado no seguinte fragmento de especificação:spec: containers: ... capabilities: securityContext: executeAsCaller: true
Essa configuração informa ao Snowflake que o aplicativo pretende usar os direitos do autor da chamada e faz com que o Snowflake insira o cabeçalho
Sf-Context-Current-User-Tokenem todas as solicitações de entrada antes de enviar a solicitação ao contêiner do aplicativo. Esse token de usuário facilita a execução da consulta como o usuário chamador. Se não for especificado, o padrão éexecuteAsCallerparafalse.A especificação da opção
executeAsCallernão afeta a capacidade do serviço de executar consultas como o usuário do serviço e a função de proprietário do serviço. Com oexecuteAsCallerativado, o serviço tem a opção de se conectar ao Snowflake como usuário chamador e como usuário de serviço.Para estabelecer uma conexão com o Snowflake em nome do usuário que faz a chamada, atualize o código do seu aplicativo para criar um token de login que inclua o token OAuth que o Snowflake forneceu ao serviço e o token de usuário do cabeçalho
Sf-Context-Current-User-Token.O token de login deve seguir este formato:
<service-oauth-token>.<Sf-Context-Current-User-Token>.Essa atualização está demonstrada no fragmento de código Python a seguir:
# Environment variables below will be automatically populated by Snowflake. SNOWFLAKE_ACCOUNT = os.getenv("SNOWFLAKE_ACCOUNT") SNOWFLAKE_HOST = os.getenv("SNOWFLAKE_HOST") def get_login_token(): with open("/snowflake/session/token", "r") as f: return f.read() def get_connection_params(ingress_user_token = None): # start a Snowflake session as ingress user # (if user token header provided) if ingress_user_token: logger.info("Creating a session on behalf of the current user.") token = get_login_token() + "." + ingress_user_token else: logger.info("Creating a session as the service user.") token = get_login_token() return { "account": SNOWFLAKE_ACCOUNT, "host": SNOWFLAKE_HOST, "authenticator": "oauth", "token": token } def run_query(request, query): ingress_user_token = request.headers.get('Sf-Context-Current-User-Token') # ingress_user_token is None if header not present connection_params = get_connection_params(ingress_user_token) with Session.builder.configs(connection_params).create() as session: # use the session to execute a query.
No exemplo acima:
A função
get_login_tokenlê o arquivo em que o Snowflake copiou o token OAuth para ser usado pelo contêiner.A função
get_connection_paramsconstrói um token concatenando os tokens OAuth e de usuário do cabeçalhoSf-Context-Current-User-Token. A função inclui esse token em um dicionário de parâmetros que o aplicativo usa para se conectar ao Snowflake.
Nota
Quando um serviço usa os direitos do autor da chamada, ele pode se conectar ao Snowflake como vários usuários. Você é responsável por gerenciar o acesso a recursos que não são gerenciados pelo Snowflake.
Por exemplo, nos apps Streamlit, o objeto st.connection armazena automaticamente a conexão em cache usando st.cache_resource no estado global, tornando-o acessível em todas as sessões do Streamlit iniciadas por usuários diferentes. Ao usar os direitos do autor da chamada, considere usar st.session_state para armazenar conexões por sessão para evitar compartilhar conexões entre usuários.
Para obter um exemplo com instruções passo a passo, consulte Criação de um serviço com os direitos do chamador ativados.
Acesso a um serviço com direitos de chamador configurados¶
A configuração dos direitos do autor da chamada indica que o seu serviço está estabelecendo uma conexão com o Snowflake em nome do autor da chamada. O modo como você faz login nos pontos de extremidade de entrada do serviço, programaticamente ou usando um navegador, permanece o mesmo. Após o login, os seguintes comportamentos e opções serão aplicados:
Acesso a um ponto de extremidade público usando um navegador: depois que você fizer login em um ponto de extremidade, o serviço estabelecerá uma conexão com o Snowflake em nome do usuário que faz a chamada usando a função padrão do usuário. Se não houver uma função padrão configurada para o usuário, será usada a função PUBLIC.
Acesso a um ponto de extremidade público de forma programática: ao fazer login em um ponto de extremidade programaticamente usando o token JWT, você pode definir o parâmetro
scopepara especificar a função a ser ativada.
Atualmente, depois que um serviço estabelece a conexão de direitos de um chamador com o Snowflake em nome do chamador, não há suporte para a troca de funções. Se o seu aplicativo precisa usar funções diferentes para acessar objetos distintos, você deve alterar a propriedade de funções secundárias padrão do usuário.
Para configurar o usuário para ter todas as funções secundárias ativas por padrão, use o comando ALTER USER para definir a propriedade DEFAULT_SECONDARY_ROLES do usuário como ALL, conforme mostrado no exemplo a seguir:
ALTER USER my_user SET DEFAULT_SECONDARY_ROLES = ( 'ALL' );
Gerenciamento de concessões do chamador para um serviço¶
Quando um serviço cria uma sessão de direitos do autor da chamada, a sessão opera como o usuário que faz a chamada, e não como o usuário do serviço. Quando uma operação é realizada usando essa sessão, o Snowflake aplica uma sequência de duas verificações de permissões:
A primeira verificação de permissões é realizada como se o usuário tivesse criado a sessão diretamente. Essa verificação faz parte das verificações normais de permissão que o Snowflake realiza para o usuário.
A segunda verificação de permissões constata se o serviço tem permissão para executar a operação em nome de um usuário. O Snowflake verifica isso garantindo que a função de proprietário do serviço tenha recebido as concessões de autor da chamada necessárias.
Em uma sessão de direitos do chamador, tanto a verificação de permissão normal quanto a verificação da função proprietária do serviço devem permitir a operação; isso é chamado de direitos restritos do chamador. Por padrão, o serviço não tem permissão para fazer nada em nome de um usuário. Você deve conceder explicitamente concessões de chamador ao serviço para que ele possa ser executado com os privilégios do chamador.
Por exemplo, suponha que o usuário U1 utilize a função R1, que tem o privilégio SELECT na tabela T1. Quando U1 faz login no ponto de extremidade público do seu serviço (example_service), que está configurado para usar os direitos do chamador, o serviço estabelece uma conexão com a Snowflake em nome de U1.
Para permitir que o serviço consulte a tabela T1 em nome de U1, você precisa conceder à função de proprietário do serviço os seguintes privilégios:
Privilégios para resolver o nome da tabela, concedendo uma concessão ao chamador que permita que o serviço seja executado com o privilégio USAGE no banco de dados e no esquema dessa tabela.
Privilégios para usar um warehouse para executar consultas, concedendo uma concessão ao chamador que permite que o serviço seja executado com o privilégio USAGE em um warehouse.
Privilégios para consultar a tabela concedendo uma concessão de chamador que permite que o serviço seja executado com o privilégio SELECT na tabela
T1.
O exemplo a seguir mostra como conceder a função de proprietário do serviço com esses privilégios:
-- Permissions to resolve the table's name.
GRANT CALLER USAGE ON DATABASE <db_name> TO ROLE <service_owner_role>;
GRANT CALLER USAGE ON SCHEMA <schema_name> TO ROLE <service_owner_role>;
-- Permissions to use a warehouse
GRANT CALLER USAGE ON WAREHOUSE <warehouse_name> TO ROLE <service_owner_role>;
-- Permissions to query the table.
GRANT CALLER SELECT ON TABLE T1 TO ROLE <service_owner_role>;
Qualquer função em sua conta que tenha o privilégio global MANAGE CALLER GRANT pode conceder concessões de chamador. Para obter mais informações sobre as concessões do chamador, consulte GRANT CALLER e Direitos restritos do chamador.
Exemplo¶
É fornecido um exemplo de um serviço que usa o recurso de direitos do autor da chamada ao executar consultas SQL em nome dos usuários. Para obter mais informações, consulte Criação de um serviço com os direitos do chamador ativados.
Conectar-se ao Snowflake usando outras credenciais¶
Você pode usar outras formas de autenticação para conectar-se ao Snowflake, não apenas o token OAuth fornecido pelo Snowflake. Para fazer isso, crie uma integração de acesso externo (EAI) que permita que seu contêiner se conecte ao Snowflake como se o contêiner estivesse sendo executado fora do Snowflake e conectando-se pela Internet. Ao conectar-se dessa forma, você não precisa configurar o host usado pelo cliente.
Nota
Como essas conexões atravessam um EAI, a autenticação do Snowflake também aplica políticas de rede. Caso sua empresa exija políticas de rede, não será possível se conectar com outras credenciais.
Por exemplo, a conexão a seguir especifica o nome de usuário e a senha para autenticação:
conn = snowflake.connector.connect(
account = '<acct-name>',
user = '<user-name>',
password = '<password>'
)
Para usar um nome de host padrão, você precisa da integração de acesso externo com uma regra de rede que permita o acesso do seu serviço ao nome de host de internet do Snowflake em sua conta. Por exemplo, se o nome da sua conta for MYACCOUNT na organização MYORG, o nome do host será myorg-myaccount.snowflakecomputing.com. Para obter mais informações, consulte Configuração da saída da rede. Nomes de host PrivateLink não são compatíveis.
Crie uma regra de rede que corresponda ao nome de host da Snowflake API da sua conta:
CREATE OR REPLACE NETWORK RULE snowflake_egress_access MODE = EGRESS TYPE = HOST_PORT VALUE_LIST = ('myorg-myaccount.snowflakecomputing.com');
Crie uma integração que use a regra de rede anterior:
CREATE EXTERNAL ACCESS INTEGRATION snowflake_egress_access_integration ALLOWED_NETWORK_RULES = (snowflake_egress_access) ENABLED = TRUE;
Configuração do contexto de banco de dados e esquema para execução de SQL¶
Além de fornecer as credenciais, o Snowflake fornece o contexto de banco de dados e esquema no qual o serviço é criado. O código do contêiner pode usar essa informação para executar SQL no mesmo contexto de banco de dados e esquema que o serviço.
Esta seção explica dois conceitos:
A lógica que o Snowflake usa para determinar o banco de dados e o esquema no qual criar seu serviço.
O método pelo qual o Snowflake transmite essas informações aos seus contêineres, permitindo assim que o código do contêiner execute SQL no mesmo banco de dados e contexto de esquema.
O Snowflake usa o nome do serviço para determinar o banco de dados e o esquema no qual criar um serviço:
Exemplo 1: nos seguintes comandos CREATE SERVICE e EXECUTE JOB SERVICE, o nome do serviço não especifica explicitamente um nome de banco de dados e esquema. O Snowflake cria o serviço e o serviço de trabalho no banco de dados e esquema atuais.
-- Create a service. CREATE SERVICE test_service IN COMPUTE POOL ... -- Execute a job service. EXECUTE JOB SERVICE IN COMPUTE POOL tutorial_compute_pool NAME = example_job_service ...
Exemplo 2: nos seguintes comandos CREATE SERVICE e EXECUTE JOB SERVICE, o nome do serviço inclui um nome de banco de dados e esquema. Snowflake cria o serviço e serviço do trabalho no banco de dados (
test_db) e esquema (test_schema) especificados, independentemente do esquema atual.-- Create a service. CREATE SERVICE test_db.test_schema.test_service IN COMPUTE POOL ... -- Execute a job service. EXECUTE JOB SERVICE IN COMPUTE POOL tutorial_compute_pool NAME = test_db.test_schema.example_job_service ...
Quando o Snowflake inicia um serviço, ele fornece informações de banco de dados e esquema para os contêineres em execução usando as seguintes variáveis de ambiente:
SNOWFLAKE_DATABASE
SNOWFLAKE_SCHEMA
O código do contêiner pode usar variáveis de ambiente no código de conexão para determinar qual banco de dados e esquema usar, conforme mostrado neste exemplo:
conn = snowflake.connector.connect(
host = os.getenv('SNOWFLAKE_HOST'),
account = os.getenv('SNOWFLAKE_ACCOUNT'),
token = get_login_token(),
authenticator = 'oauth',
database = os.getenv('SNOWFLAKE_DATABASE'),
schema = os.getenv('SNOWFLAKE_SCHEMA')
)
Exemplo
No Tutorial 2, você cria um serviço de trabalho do Snowflake que se conecta ao Snowflake e executa instruções SQL. As etapas a seguir resumem como o código do tutorial usa as variáveis de ambiente:
Na configuração comum (consulte a seção Configuração comum), você cria recursos, incluindo um banco de dados e um esquema. Você também define o banco de dados e o esquema atuais para a sessão:
USE DATABASE tutorial_db; ... USE SCHEMA data_schema;
Depois de criar um serviço de trabalho (executando EXECUTE JOB SERVICE), o Snowflake inicia o contêiner e define as seguintes variáveis de ambiente no contêiner para o banco de dados e o esquema atuais da sessão:
SNOWFLAKE_DATABASE é definido como “TUTORIAL_DB”
SNOWFLAKE_SCHEMA é definido como “DATA_SCHEMA”
O código do trabalho (consulte
main.pyno Tutorial 2) lê estas variáveis de ambiente:SNOWFLAKE_DATABASE = os.getenv('SNOWFLAKE_DATABASE') SNOWFLAKE_SCHEMA = os.getenv('SNOWFLAKE_SCHEMA')
O código do trabalho define o banco de dados e o esquema como o contexto no qual executar as instruções SQL (função
run_job()emmain.py):{ "account": SNOWFLAKE_ACCOUNT, "host": SNOWFLAKE_HOST, "authenticator": "oauth", "token": get_login_token(), "warehouse": SNOWFLAKE_WAREHOUSE, "database": SNOWFLAKE_DATABASE, "schema": SNOWFLAKE_SCHEMA } ...
Nota
SNOWFLAKE_ACCOUNT, SNOWFLAKE_HOST, SNOWFLAKE_DATABASE, SNOWFLAKE_SCHEMA são variáveis de ambiente que o Snowflake gera para o contêiner do aplicativo, mas SNOWFLAKE_WAREHOUSE não é (o código do aplicativo do Tutorial 2 criou essa variável porque o Snowflake não passa um nome de warehouse para um contêiner).
Como especificar o warehouse para seu contêiner¶
Se seu serviço se conectar ao Snowflake para executar uma consulta em um warehouse do Snowflake, você terá as seguintes opções para especificar um warehouse:
Especifique um warehouse no código do seu aplicativo. Especifique um warehouse como parte da configuração da conexão ao iniciar uma sessão do Snowflake para executar consultas no seu código. Para obter um exemplo, consulte Tutorial 2.
Especifique um warehouse padrão ao criar um serviço. Especifique o parâmetro opcional QUERY_WAREHOUSE no comando CREATE SERVICE ou EXECUTE JOB SERVICE para fornecer um warehouse padrão. Se o código do seu aplicativo não fornecer um warehouse como parte da configuração da conexão, o Snowflake usará o warehouse padrão. Use o comando ALTER SERVICE para mudar o warehouse padrão.
Nota
O warehouse especificado usando o parâmetro QUERY_WAREHOUSE é o padrão somente para o usuário do serviço. Quando o serviço se conecta ao Snowflake em nome de outro usuário, no contexto do cenário de direitos do autor da chamada, o Snowflake usa o warehouse padrão do usuário.
Se você especificar um warehouse usando ambos os métodos, o warehouse especificado no código do aplicativo será usado.
Acessar o histórico de consultas do usuário do serviço¶
Encontre as consultas executadas pelo seu serviço como usuário do serviço filtrando a função Exibição QUERY_HISTORY ou QUERY_HISTORY, em que user_type is SNOWFLAKE_SERVICE.
Exemplo 1: Busca de consultas executadas por um serviço.
SELECT *
FROM snowflake.account_usage.query_history
WHERE user_type = 'SNOWFLAKE_SERVICE'
AND user_name = '<service_name>'
AND user_database_name = '<service_db_name>'
AND user_schema_name = '<service_schema_name>'
order by start_time;
Na cláusula WHERE:
user_name = '<service_name>': você especifica o nome do serviço como o nome de usuário porque um serviço executa consultas como o usuário do serviço, e o nome do usuário do serviço é o mesmo que o nome do serviço.user_type = 'SNOWFLAKE_SERVICE'euser_name = '<service_name>': isso limita o resultado da consulta para recuperar apenas as consultas executadas por um serviço.user_database_nameeuser_schema_name: para um usuário do serviço, esses são o banco de dados e o esquema do serviço.
Você pode obter os mesmos resultados chamando a função QUERY_HISTORY.
SELECT *
FROM TABLE(<service_db_name>.information_schema.query_history())
WHERE user_database_name = '<service_db_name>'
AND user_schema_name = '<service_schema_name>'
AND user_type = 'SNOWFLAKE_SERVICE'
AND user_name = '<service_name>'
order by start_time;
Na cláusula WHERE:
user_type = 'SNOWFLAKE_SERVICE'euser_name = '<service_name>'limitam o resultado da consulta para recuperar apenas as consultas executadas por um serviço.Os nomes
user_database_nameeuser_schema_name(para um usuário de serviço) são o banco de dados e o esquema do serviço.
Exemplo 2: buscar consultas executadas por serviços e as informações de serviço correspondentes.
SELECT query_history.*, services.*
FROM snowflake.account_usage.query_history
JOIN snowflake.account_usage.services
ON query_history.user_name = services.service_name
AND query_history.user_schema_id = services.service_schema_id
AND query_history.user_type = 'SNOWFLAKE_SERVICE'
A consulta une as exibições QUERY_HISTORY e SERVICES para recuperar informações sobre as consultas e os serviços que executaram as consultas. Observe o seguinte:
Para consultas executadas por serviços,
query_history.user_nameé o nome do usuário do serviço, que é o mesmo que o nome do serviço.A consulta une as exibições usando os IDs de esquema (não o nome do esquema) para garantir que você se refira ao mesmo esquema, porque se você remover e recriar um esquema, o ID do esquema será alterado, mas o nome permanecerá o mesmo.
Você pode adicionar filtros opcionais à consulta. Por exemplo:
Filtre
query_historypara recuperar apenas serviços que executaram consultas específicas.Filtre
servicespara recuperar apenas consultas executadas por serviços específicos.
Exemplo 3: Para cada serviço, busque informações do usuário do serviço.
SELECT services.*, users.*
FROM snowflake.account_usage.users
JOIN snowflake.account_usage.services
ON users.name = services.service_name
AND users.schema_id = services.service_schema_id
AND users.type = 'SNOWFLAKE_SERVICE'
A consulta une as exibições SERVICES e USERS no esquema ACCOUNT_USAGE para recuperar serviços e informações do usuário do serviço. Observe o seguinte:
Quando um serviço executa consultas, ele as executa como usuário do serviço e o nome do usuário do serviço é o mesmo que o nome do serviço. Portanto, você especifica a condição de junção:
users.name = services.service_name.Os nomes de serviço são exclusivos apenas dentro de um esquema. Portanto, a consulta especifica a condição de junção (
users.schema_id = services.service_schema_id) para garantir que cada usuário do serviço seja correspondido ao serviço específico ao qual pertence (e não a qualquer outro serviço com o mesmo nome em execução em esquemas diferentes).