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, apenas o proprietário da instância pode acessar log in e acessar a instância através do Postgres. log in Para permitir que outras identidades Databricks se conectem à instância do banco de dados, a identidade Databricks deve possuir 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 Postgres e conceder privilégios para identidades Databricks

Crie funções Postgres utilizando a interface do usuário do Databricks ou consultas 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 possui o nível de acesso adequado antes de tentar gerenciar funções.

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

Os usuários com CAN MANAGE podem criar funções adicionais para outras identidades do Databricks, incluindo privilégios adicionais, e remover funções de qualquer identidade do Databricks.

É possível 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 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. É necessário selecionar uma identidade Databricks que ainda não possua 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 quais atributos do PostgreSQL serão 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 funções de identidade d Databricks

É possível visualizar quais usuários, grupos e entidades de serviço possuem 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 .

Utilize consultas 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, incluindo 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 utilizar a função, substitua um nome de usuário do Databricks por <your_user>, o nome da sua instância por databricks_postgres e o nome da sua tabela por <my_table> na seguinte consulta:

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

A seguinte instrução " SQL " cria uma função chamada " pg_temp.make_owner_acl " que retorna uma lista detalhada " view " de todas as permissões concedidas, excluindo 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 visualizar todas as funções das quais uma determinada função faz parte, utilize 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 utilizar a função, substitua <your_user> por um nome de usuário Databricks:

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

Encontre administradores de funções

Para visualizar o administrador de uma função, utilize 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;