Pular para o conteúdo principal

gerenciar funções do Postgres

info

Visualização

Esse recurso está em Public Preview nas seguintes regiões: us-east-1, us-west-2, eu-west-1, ap-southeast-1, ap-southeast-2, eu-central-1, us-east-2, ap-south-1.

Uma função Postgres para a identidade Databricks do proprietário da instância do banco de dados Lakebase é criada automaticamente.

Inicialmente, somente o proprietário da instância pode log in e acessar a instância por meio do Postgres. Para permitir que outras identidades Databricks log in acessem a instância do banco de dados, a identidade Databricks deve ter uma função Postgres correspondente.

Esta página descreve como adicionar e gerenciar funções adicionais baseadas em identidade da Databricks no PostgreSQL.

Criar funções do Postgres e conceder privilégios para identidades do Databricks

Crie funções do Postgres usando a interface do usuário do Databricks ou consultas do PostgreSQL.

nota

As ações de gerenciamento de funções são regidas pelas permissões concedidas na instância do banco de dados. Certifique-se de que o senhor tenha o nível de acesso adequado antes de tentar gerenciar as funções.

Os usuários com permissão CAN USE na instância do banco de dados podem view as funções existentes do Postgres associadas às identidades Databricks ou adicionar uma função para sua própria identidade na instância.

Os usuários com CAN MANAGE podem também criar funções para outras identidades da Databricks, inclusive com privilégios adicionais, e eliminar funções para qualquer identidade da Databricks.

O senhor pode atribuir permissões adicionais a quaisquer usuários, grupos ou entidades de serviço desejados na página de visão geral das instâncias do banco de dados .

  1. Clique em Computação na barra lateral do workspace.

  2. Clique em Instâncias de banco de dados.

  3. Clique na guia Permissões .

  4. Clique em Add PostgreSQL role (Adicionar função PostgreSQL ) no canto superior direito.

  5. Para a identidade do espaço de trabalho , insira um usuário, grupo ou entidade de serviço e selecione a identidade Databricks. O senhor deve selecionar uma identidade Databricks que ainda não tenha uma função Postgres na instância.

  6. Selecione uma associação à função . Se você tiver a permissão CAN MANAGE na instância do banco de dados, poderá adicionar associação à funçãodatabricks_superuser e ativar alguns atributos da função.

  7. Selecione os atributos do PostgreSQL a serem concedidos à nova função.

    • CREATEDB: concede permissão para criar novos bancos de dados
    • CREATEROLE: concede permissão para criar novas funções
    • BYPASS RLS: concede permissão para ignorar toda a segurança em nível de linha na instância
  8. Clique em Confirmar .

Visualizar Databricks funções de identidade

É possível ver quais usuários, grupos e entidades de serviço têm uma função Postgres correspondente na página de visão geral das instâncias de banco de dados .

  1. Clique em Computação na barra lateral do workspace.
  2. Clique em Instâncias de banco de dados.
  3. Clique na guia Permissões .

Eliminar uma função Postgres baseada em identidade da Databricks

A eliminação de uma função não pode ser desfeita. Você pode recriar uma função, mas qualquer reatribuição de propriedade de objeto não é reversível sem eliminar a nova função que possui objetos reatribuídos.

  1. Clique em Computação na barra lateral do workspace.
  2. Clique em Instâncias de banco de dados.
  3. Clique na guia Permissões .
  4. Para a identidade da função que você deseja eliminar, no lado direito, clique em. Ícone do menu Kebab.
  5. Clique em Descartar função .
  6. Se você precisar abandonar uma função que possui objetos, ative Reatribuir objetos de propriedade . Isso reatribuirá todos os objetos de propriedade reatribuíveis (bancos de dados, esquemas e tabelas) à outra função e, em seguida, eliminará todos os objetos de propriedade não reatribuíveis.
  7. Clique em Confirmar .

Use as consultas do PostgreSQL para verificar as permissões do Postgres

Para ler ou gravar em uma tabela no Postgres, os usuários precisam das seguintes permissões:

  • CONNECT no banco de dados
  • USO no esquema
  • USO na mesa

Verifique as permissões do usuário em uma tabela específica

Execute a seguinte instrução SQL para criar uma função chamada pg_temp.check_permissions que verifica as permissões de um usuário, inclusive as permissões herdadas.

SQL
CREATE OR REPLACE FUNCTION pg_temp.check_permissions(TEXT, TEXT, TEXT, TEXT)
RETURNS TABLE(database_connect BOOLEAN, schema_usage BOOLEAN, table_select BOOLEAN,
table_insert BOOLEAN, table_update BOOLEAN, table_delete BOOLEAN) AS $$
SELECT
has_database_privilege($1, $2, 'CONNECT'),
has_schema_privilege($1, $3, 'USAGE'),
has_table_privilege($1, $4, 'SELECT'),
has_table_privilege($1, $4, 'INSERT'),
has_table_privilege($1, $4, 'UPDATE'),
has_table_privilege($1, $4, 'DELETE')
$$ LANGUAGE sql
;

Para usar a função, substitua um nome de usuário do Databricks por <your_user>, o nome da instância por databricks_postgres e o nome da tabela por <my_table> na consulta a seguir:

SQL
SELECT * FROM pg_temp.check_permissions('<your_user>', 'databricks_postgres', 'public', '<my_table>');

visualizar todas as permissões para banco de dados, esquema e tabela

O seguinte comando SQL cria uma função chamada pg_temp.make_owner_acl que retorna um view detalhado de todas as permissões concedidas, excluindo as permissões herdadas, para todos os usuários:

SQL
CREATE OR REPLACE FUNCTION pg_temp.make_owner_acl(owner_oid OID)
RETURNS TABLE(grantor OID, grantee OID, privilege_type TEXT, is_grantable BOOLEAN) AS $$
SELECT owner_oid, owner_oid,'OWNER'::TEXT, True
$$ LANGUAGE SQL;

CREATE OR REPLACE FUNCTION pg_temp.get_all_permissions(TEXT, TEXT, TEXT)
RETURNS TABLE(type TEXT, name TEXT, role TEXT, acl TEXT, can_grant TEXT) AS $$
SELECT type, name,
CASE WHEN grantee = 0 THEN 'PUBLIC' ELSE pg_get_userbyid(grantee) END AS role, privilege_type,
CASE WHEN privilege_type = 'OWNER' THEN 'YES, ALL' WHEN is_grantable THEN 'YES' ELSE 'NO' END AS can_grant
FROM (
SELECT 'DATABASE' type, datname as name, (pg_temp.make_owner_acl(datdba)).*
FROM pg_database
WHERE datname = $1
UNION ALL
SELECT 'DATABASE' type, datname as name, (aclexplode(datacl)).*
FROM pg_database
WHERE datname = $1
UNION ALL
SELECT 'SCHEMA' type, nspname as name, (pg_temp.make_owner_acl(nspowner)).*
FROM pg_namespace
WHERE nspname = $2
UNION ALL
SELECT 'SCHEMA' type, nspname as name, (aclexplode(nspacl)).*
FROM pg_namespace
WHERE nspname = $2
UNION ALL
SELECT 'TABLE' type, relname as name, (pg_temp.make_owner_acl(relowner)).*
FROM pg_class
WHERE relname = $3
UNION ALL
SELECT 'TABLE' type, relname as name, (aclexplode(relacl)).*
FROM pg_class
WHERE relname = $3
)
$$ LANGUAGE SQL
;

Para usar a função, substitua o nome da instância por databricks_postgres e o nome da tabela por <my_table> na consulta a seguir:

SQL
SELECT * FROM pg_temp.get_all_permissions('databricks_postgres', 'public', '<mytable>');

Verifique a hierarquia de herança de funções

No Postgres, uma função pode ser membro de outra função, e a associação especifica se as permissões são herdadas da função principal. Para ver todas as funções das quais uma determinada função faz parte, use a seguinte instrução SQL para criar a função SQL pg_temp.get_inherited_roles:

SQL
CREATE OR REPLACE FUNCTION pg_temp.get_inherited_roles(
role_name TEXT
)
RETURNS TABLE(inherited_roles TEXT, member_via TEXT, inherits_permissions TEXT) AS $$
WITH RECURSIVE role_tree AS (
SELECT
m.roleid,
pg_get_userbyid(m.roleid) rolname,
'DIRECT' COLLATE "C" as member_via,
m.inherit_option as inherits_permissions
FROM pg_auth_members m
WHERE m.member = (SELECT oid FROM pg_roles WHERE rolname = $1)
UNION ALL
SELECT
m.roleid,
pg_get_userbyid(m.roleid) rolname,
rt.rolname::text as member_via,
(rt.inherits_permissions AND m.inherit_option) as inherits_permissions
FROM pg_auth_members m
JOIN role_tree rt ON m.member = rt.roleid
)
SELECT
rolname AS inherited_roles,
member_via,
CASE WHEN inherits_permissions THEN 'YES' ELSE 'NO' END as inherits_permissions
FROM role_tree
GROUP BY inherited_roles, member_via, inherits_permissions
ORDER BY inherits_permissions DESC
$$ LANGUAGE sql
;

Para usar a função, substitua um nome de usuário do Databricks por <your_user>:

SQL
SELECT * FROM pg_temp.get_inherited_roles('<your role>');

Encontre administradores de funções

Para ver o administrador de uma função, use a seguinte consulta SQL e substitua o nome da função por <target_role>:

SQL
SELECT pg_get_userbyid(m.member) admin
FROM pg_auth_members m
WHERE m.roleid = (SELECT oid FROM pg_roles WHERE rolname = '<target_role>')
AND m.admin_option = true;