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)
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 objetoUser
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)
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())
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)
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()
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 objetoRole
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)
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")
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)
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()
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 objetoDatabaseRole
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)
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')
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)
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()
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')
)
Função Grant¶
from snowflake.core.role import Securable
root.roles['my_role'].grant_role(role_type="ROLE", role=Securable(name='my_role_1'))
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'),
)
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'),
)
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')
)
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'))
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'),
)
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'),
)
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')
)
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'),
)
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'),
)
Listagem de concessões para a função¶
root.roles['my_role'].iter_grants_to()
Listagem de subsídios na função¶
root.roles['my_role'].iter_grants_on()
Listagem de concessões da função¶
root.roles['my_role'].iter_grants_of()
Listagem de futuras concessões para a função¶
root.roles['my_role'].iter_future_grants_to()
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'))
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'))
Listagem de funções concedidas a um usuário¶
root.users['my_user'].iter_grants_to()
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')
)
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'))
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'),
)
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'),
)
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')
)
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'))
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'),
)
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'),
)
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')
)
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'),
)
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'),
)
Listagem de concessões para a função¶
root.databases['my_db'].database_roles['my_db_role'].iter_grants_to()
Listagem de futuras concessões para a função¶
root.databases['my_db'].database_roles['my_db_role'].iter_future_grants_to()
Gerenciamento de concessões usando o recurso Grant
– Obsoleto¶
É 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],
)
)
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],
)
)
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'),
)
)