Gerenciamento de usuários, funções e concessões Snowflake com Python

É possível usar o Python para gerenciar usuários, funções e concessões Snowflake. Para obter mais informações sobre como gerenciar usuários e seus privilégios no Snowflake, consulte Gerenciamento de usuários.

Pré-requisitos

Os exemplos neste tópico pressupõem que você tenha adicionado código para se conectar ao Snowflake e criar um objeto Root a partir do qual usar o Snowflake Python APIs.

Por exemplo, o seguinte código usa parâmetros de conexão definidos em um arquivo de configuração para criar uma conexão com o Snowflake:

from snowflake.core import Root
from snowflake.snowpark import Session

session = Session.builder.config("connection_name", "myconnection").create()
root = Root(session)
Copy

Usando o objeto Session resultante, o código cria um objeto Root para usar os tipos e métodos de API. Para obter mais informações, consulte Conexão ao Snowflake com o Snowflake Python APIs.

Gerenciamento de usuários

É possível gerenciar usuários no Snowflake. Um usuário é um objeto de nível de conta no Snowflake. O Snowflake Python APIs representa usuários com dois tipos separados:

  • User: Expõe as propriedades de um usuário, como seu nome.

  • UserResource: Expõe métodos que podem ser usados para buscar um objeto User correspondente e descartar o usuário.

Criação de um usuário

É possível criar um usuário chamando o método UserCollection.create e passando um objeto User que representa o usuário que você deseja criar. Para criar um usuário, primeiro crie um objeto User que especifique o nome do usuário.

O código no exemplo a seguir cria um objeto User que representa um usuário nomeado my_user e, em seguida, cria o usuário passando o objeto User para o método UserCollection.create:

from snowflake.core.user import User

my_user = User(name="my_user")
root.users.create(my_user)
Copy

Como obter detalhes do usuário

É possível obter informações sobre um usuário chamando o método UserResource.fetch, que retorna um objeto User.

O código no exemplo a seguir obtém informações sobre um usuário nomeado my_user:

my_user = root.users["my_user"].fetch()
print(my_user.to_dict())
Copy

Listagem de usuários

É possível listar usuários usando o método iter, que retorna um iterador PagedIter.

O código no exemplo a seguir lista usuários cujos nomes começam com my:

users = root.users.iter(like="my%")
for user in users:
  print(user.name)
Copy

Descarte de um usuário

É possível remover um usuário usando o método UserResource.drop.

O código no exemplo a seguir remove o usuário my_user.

my_user_res = root.users["my_user"]
my_user_res.drop()
Copy

Gerenciamento de funções

É possível gerenciar funções no Snowflake. Uma função é um objeto de nível de conta. O Snowflake Python APIs representa funções com dois tipos separados:

  • Role: Expõe as propriedades de uma função, como seu nome.

  • RoleResource: Expõe métodos que podem ser usados para buscar um objeto Role correspondente e descartar a função.

Criação de uma função

Para criar uma função, primeiro crie um objeto Role que especifique o nome da função.

O código no exemplo a seguir cria um objeto Role que representa uma função nomeada my_role:

from snowflake.core.role import Role

my_role = Role(name="my_role")
root.roles.create(my_role)
Copy

O código então cria a função passando o objeto Role para o método RoleCollection.create.

Como usar uma função em uma sessão

O código no exemplo a seguir aplica a função my_role na sessão atual.

root.session.use_role("my_role")
Copy

Listagem de funções

É possível listar as funções em uma conta usando o método iter. O método retorna um iterador PagedIter de objetos Role.

O código no exemplo a seguir lista todos os nomes de função em uma conta:

role_list = root.roles.iter()
for role_obj in role_list:
  print(role_obj.name)
Copy

Descarte de uma função

É possível descartar uma função usando o método RoleResource.drop.

O código no exemplo a seguir descarta a função my_role:

my_role_res = root.roles["my_role"]
my_role_res.drop()
Copy

Gerenciamento de funções de bancos de dados

É possível gerenciar funções de banco de dados no Snowflake. Uma função de banco de dados é um objeto de nível de banco de dados. O Snowflake Python APIs representa funções de banco de dados com dois tipos separados:

  • DatabaseRole: Expõe as propriedades de uma função de banco de dados, como seu nome e um comentário.

  • DatabaseRoleResource: Expõe métodos que podem ser usados para buscar um objeto DatabaseRole correspondente e remover a função do banco de dados.

Criação de uma função de banco de dados

Para criar uma função de banco de dados, primeiro crie um objeto DatabaseRole que especifique o nome da função.

O código no exemplo a seguir cria um objeto DatabaseRole que representa uma função de banco de dados nomeada my_db_role:

from snowflake.core.database_role import DatabaseRole

my_db_role = DatabaseRole(
  name="my_db_role",
  comment="sample comment"
)

my_db_role_ref = root.databases['my_db'].database_roles.create(my_db_role)
Copy

O código então cria a função do banco de dados passando o objeto DatabaseRole ao método DatabaseRoleCollection.create.

Clonagem de uma função de banco de dados

O código no exemplo a seguir cria uma função de banco de dados nomeada dr2 no banco de dados de destino my_db_2 como uma cópia da função de banco de dados dr1 existente no banco de dados my_db.

database_role_ref = root.databases['my_db'].database_roles['dr1'].clone(target_database_role='dr2', target_database='my_db_2')
Copy

Listagem de funções de banco de dados

É possível listar as funções de banco de dados em uma conta usando o método iter. O método retorna um iterador PagedIter de objetos DatabaseRole.

O código no exemplo a seguir lista a função do banco de dados nomeada my_db_role no banco de dados my_db, limitando o número de resultados para 1:

db_role_list = root.databases['my_db'].database_roles.iter(limit=1, from_name='my_db_role')
for db_role_obj in db_role_list:
  print(db_role_obj.name)
Copy

Descarte de uma função de banco de dados

É possível remover uma função de banco de dados usando o método DatabaseRoleResource.drop.

O código no exemplo a seguir descarta a função de banco de dados my_db_role:

root.databases['my_db'].database_roles['my_db_role'].drop()
Copy

Gerenciamento dos privilégios de acesso

É possível usar a API para gerenciar privilégios de acesso em um objeto Snowflake protegível para uma função de conta, função de banco de dados ou usuário. Para obter mais informações sobre funções, objetos protegíveis e a estrutura de controle de acesso no Snowflake, consulte Visão geral do controle de acesso.

Para funções de conta

Os exemplos de código a seguir demonstram as operações da API para conceder privilégios, revogar privilégios e listar concessões para funções de conta.

Privilégios Grant

from snowflake.core.role import Securable

root.roles['my_role'].grant_privileges(
    privileges=["OPERATE"], securable_type="WAREHOUSE", securable=Securable(name='my_wh')
)
Copy

Função Grant

from snowflake.core.role import Securable

root.roles['my_role'].grant_role(role_type="ROLE", role=Securable(name='my_role_1'))
Copy

Privilégios Grant para todos

from snowflake.core.role import ContainingScope

root.roles['my_role'].grant_privileges_on_all(
    privileges=["SELECT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

Privilégios Grant futuros

from snowflake.core.role import ContainingScope

root.roles['my_role'].grant_future_privileges(
    privileges=["SELECT", "INSERT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

Revogação de privilégios

from snowflake.core.role import Securable

root.roles['my_role'].revoke_privileges(
    privileges=["OPERATE"], securable_type="WAREHOUSE", securable=Securable(name='my_wh')
)
Copy

Revogação de função

from snowflake.core.role import Securable

root.roles['my_role'].revoke_role(role_type="ROLE", role=Securable(name='my_role_1'))
Copy

Revogação de privilégios em todos

from snowflake.core.role import ContainingScope

root.roles['my_role'].revoke_privileges_on_all(
    privileges=["SELECT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

Revogação de privilégios futuros

from snowflake.core.role import ContainingScope

root.roles['my_role'].revoke_future_privileges(
    privileges=["SELECT", "INSERT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

Revogação da opção de concessão de privilégios

from snowflake.core.role import Securable

 root.roles['my_role'].revoke_grant_option_for_privileges(
    privileges=["OPERATE"], securable_type="WAREHOUSE", securable=Securable(name='my_wh')
)
Copy

Revogação da opção de concessão de privilégios em todos

from snowflake.core.role import ContainingScope

root.roles['my_role'].revoke_grant_option_for_privileges_on_all(
    privileges=["SELECT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

Revogação da opção de concessão para privilégios futuros

from snowflake.core.role import ContainingScope

root.roles['my_role'].revoke_grant_option_for_future_privileges(
    privileges=["SELECT", "INSERT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

Listagem de concessões para a função

root.roles['my_role'].iter_grants_to()
Copy

Listagem de subsídios na função

root.roles['my_role'].iter_grants_on()
Copy

Listagem de concessões da função

root.roles['my_role'].iter_grants_of()
Copy

Listagem de futuras concessões para a função

root.roles['my_role'].iter_future_grants_to()
Copy

Para usuários

Os exemplos de código a seguir demonstram as operações da API para conceder uma função, revogar uma função e listar funções para usuários.

Função Grant a um usuário

from snowflake.core.user import Securable

root.users['my_user'].grant_role(role_type="ROLE", role=Securable(name='my_role'))
Copy

Revogação de função de um usuário

from snowflake.core.user import Securable

root.users['my_user'].revoke_role(role_type="ROLE", role=Securable(name='my_role'))
Copy

Listagem de funções concedidas a um usuário

root.users['my_user'].iter_grants_to()
Copy

Para funções de banco de dados

Os exemplos de código a seguir demonstram as operações da API para conceder privilégios, revogar privilégios e listar concessões para funções de banco de dados.

Privilégios Grant

from snowflake.core.database_role import Securable

root.databases['my_db'].database_roles['my_db_role'].grant_privileges(
    privileges=["MODIFY"], securable_type="DATABASE", securable=Securable(name='my_db')
)
Copy

Função Grant

from snowflake.core.database_role import Securable

root.databases['my_db'].database_roles['my_db_role'].grant_role(role_type="DATABASE ROLE", role=Securable(name='my_db_role_1'))
Copy

Privilégios Grant para todos

from snowflake.core.database_role import ContainingScope

root.databases['my_db'].database_roles['my_db_role'].grant_privileges_on_all(
    privileges=["SELECT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

Privilégios Grant futuros

from snowflake.core.database_role import ContainingScope

root.databases['my_db'].database_roles['my_db_role'].grant_future_privileges(
    privileges=["SELECT", "INSERT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

Revogação de privilégios

from snowflake.core.database_role import Securable

root.databases['my_db'].database_roles['my_db_role'].revoke_privileges(
    privileges=["MODIFY"], securable_type="DATABASE", securable=Securable(name='my_db')
)
Copy

Revogação de função

from snowflake.core.database_role import Securable

root.databases['my_db'].database_roles['my_db_role'].revoke_role(role_type="DATABASE ROLE", role=Securable(name='my_db_role_1'))
Copy

Revogação de todos os privilégios

from snowflake.core.database_role import ContainingScope

root.databases['my_db'].database_roles['my_db_role'].revoke_privileges_on_all(
    privileges=["SELECT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

Revogação de privilégios futuros

from snowflake.core.database_role import ContainingScope

root.databases['my_db'].database_roles['my_db_role'].revoke_future_privileges(
    privileges=["SELECT", "INSERT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

Revogação da opção de concessão de privilégios

from snowflake.core.database_role import Securable

root.databases['my_db'].database_roles['my_db_role'].revoke_grant_option_for_privileges(
    privileges=["MODIFY"], securable_type="DATABASE", securable=Securable(name='my_db')
)
Copy

Revogação da opção de concessão de privilégios em todos

from snowflake.core.database_role import ContainingScope

root.databases['my_db'].database_roles['my_db_role'].revoke_grant_option_for_privileges_on_all(
    privileges=["SELECT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

Revogação da opção de concessão para privilégios futuros

from snowflake.core.database_role import ContainingScope

root.databases['my_db'].database_roles['my_db_role'].revoke_grant_option_for_future_privileges(
    privileges=["SELECT", "INSERT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

Listagem de concessões para a função

root.databases['my_db'].database_roles['my_db_role'].iter_grants_to()
Copy

Listagem de futuras concessões para a função

root.databases['my_db'].database_roles['my_db_role'].iter_future_grants_to()
Copy

Gerenciamento de concessões usando o recurso GrantObsoleto

É possível executar operações GRANT <privilégios> para conceder privilégios de acesso em um objeto Snowflake protegível a uma função.

Concessão de privilégios

Para conceder privilégios em um objeto Snowflake, primeiro crie um objeto Grant que especifique os seguintes atributos:

  • grantee: A função ou usuário ao qual estão sendo concedidos os privilégios.

  • securable: O objeto Snowflake que está sendo protegido pelos privilégios.

  • privileges: Os privilégios que estão sendo concedidos a uma função.

Concessão dos privilégios CREATE em uma conta para uma função

O código no exemplo a seguir cria um objeto Grant que representa uma operação de concessão que concede os privilégios create_database e create_warehouse à função my_role na conta Snowflake. O código executa a operação usando o método root.grants.grant.

from snowflake.core.grant import Grant
from snowflake.core.grant._grantee import Grantees
from snowflake.core.grant._privileges import Privileges
from snowflake.core.grant._securables import Securables

root.grants.grant(
  Grant(
    grantee=Grantees.role(name='my_role'),
    securable=Securables.current_account,
    privileges=[Privileges.create_database,
                Privileges.create_warehouse],
  )
)
Copy

Concessão de privilégios em um banco de dados para uma função

O código no exemplo a seguir concede privilégios importados no banco de dados my_db para a função my_role:

from snowflake.core.grant import Grant
from snowflake.core.grant._grantee import Grantees
from snowflake.core.grant._privileges import Privileges
from snowflake.core.grant._securables import Securables

root.grants.grant(
  Grant(
    grantee=Grantees.role('my_role'),
    securable=Securables.database('my_db'),
    privileges=[Privileges.imported_privileges],
  )
)
Copy

Concessão de uma função a outra função

É possível atribuir uma função a outra função para criar um relacionamento “pai-filho” entre as funções (também conhecido como hierarquia de função).

O código no exemplo a seguir concede a função de usuário my_role à função de sistema ACCOUNTADMIN:

from snowflake.core.grant import Grant
from snowflake.core.grant._grantee import Grantees
from snowflake.core.grant._securables import Securables

root.grants.grant(
  Grant(
    grantee=Grantees.role('ACCOUNTADMIN'),
    securable=Securables.role('my_role'),
  )
)
Copy