O modelo de permissão no nível de schema (SLPM) centraliza o gerenciamento de permissões no Hologres. Em vez de conceder privilégios individuais no nível de tabela, o SLPM organiza os usuários em grupos integrados — admin, developer, writer e viewer — e aplica as permissões automaticamente no nível de schema. Basta adicionar o usuário ao grupo apropriado; não é necessário executar instruções GRANT ou ALTER DEFAULT PRIVILEGES.
Esta página aborda como ativar o SLPM, gerenciar a associação de usuários a grupos e realizar operações de ciclo de vida, como desativar e reativar o modelo.
Limitações
O SLPM impõe isolamento rigoroso no nível de schema. Antes de ativá-lo, observe os seguintes pontos:
Views e regras entre schemas não são suportadas. Se uma view ou regra referenciar tabelas em mais de um schema, ela se tornará inacessível e retornará
ERROR: permission denied for table. Não crie views ou regras entre schemas em um banco de dados gerenciado por SLPM. Para uma exceção disponível na V1.3.36 e posteriores, consulte Criar views entre schemas no modo SLPM (Beta).-
Comandos DDL padrão são substituídos por equivalentes do SLPM. A tabela a seguir lista os comandos afetados.
Comando padrão
Motivo da substituição
Equivalente no SLPM
alter table owner to xxTodas as tabelas pertencem automaticamente ao grupo
developerdo schema.Não necessário.
grantAs permissões são concedidas adicionando usuários aos grupos.
slpm_grantrevokeAs permissões são revogadas removendo usuários dos grupos.
slpm_revokealter default privilegesNovas tabelas herdam permissões automaticamente com base no grupo do usuário.
Não necessário.
create / drop / alter / renameem grupos de usuários padrãoOs quatro grupos padrão são gerenciados pelo sistema.
Não aplicável.
rename schemaA renomeação de schemas deve passar pelo SLPM para manter a consistência das vinculações de grupos.
slpm_rename_schemadrop databaseOs grupos de usuários devem ser limpos após a exclusão de um banco de dados.
Execute
drop databasee, em seguida, chameslpm_cleanup('<dbname>'). Nomes de contas personalizadas não podem terminar com
admin,developer,writer,viewerouall_users.
Ativar o SLPM
Pré-requisitos
Antes de começar, certifique-se de ter:
Acesso de superusuário à instância do Hologres
Uma ferramenta de desenvolvimento conectada à instância (por exemplo, HoloWeb ou psql)
Ativar o SLPM para um banco de dados
-
Instale a extensão SLPM. Execute esta operação uma vez por banco de dados.
create extension slpm; -
Ative o SLPM. Certifique-se de que nenhuma instrução SQL esteja em execução no banco de dados ao executar este comando.
call slpm_enable (); -
(Opcional) Migrar do modelo de permissão padrão do PostgreSQL. Se o banco de dados já possuir tabelas, views ou tabelas externas gerenciadas sob o modelo padrão do PostgreSQL, migre a propriedade dos objetos existentes para o SLPM com o seguinte comando.
Faça login no console do Hologres. No painel de navegação à esquerda, clique em Go to HoloWeb.
Clique em Security Center. Na página DB Authorization, verifique o modelo de permissão atual.
A função
slpm_migrateprocessa até 64 usuários por execução (ajustável). Se o banco de dados tiver mais usuários, execute a função várias vezes até que todas as permissões sejam migradas. Para detalhes sobre os parâmetros, consulte slpm_migrate .-- Transfer ownership of existing objects to the developer group for SLPM management. call slpm_migrate ();Para verificar qual modelo de permissão está ativo antes de migrar:
Conceder permissões
As permissões do SLPM são concedidas adicionando usuários a grupos de usuários. Cada grupo corresponde a um schema e a um nível de permissão:
|
Grupo |
Formato |
Permissões |
|
|
|
Administração do banco de dados |
|
|
|
Leitura e escrita, DDL |
|
|
|
Leitura e escrita |
|
|
|
Somente leitura |
Para obter detalhes completos sobre as capacidades de cada grupo, consulte Grupos de usuários.
Etapa 1: Criar o usuário
Ignore esta etapa se o usuário já existir na instância.
-- Create a user.
call slpm_create_user('<account>');
-- Create a user and add them to a group in one step.
call slpm_create_user('<account>', '{dbname}.[admin|{schemaname}.developer|{schemaname}.writer|{schemaname}.viewer]');
Substitua <account> por um dos seguintes formatos:
|
Tipo de conta |
Formato |
Exemplo |
|
ID da conta Alibaba Cloud |
ID numérico |
|
|
Caixa de correio Alibaba Cloud |
|
|
|
Usuário RAM |
|
|
|
UID de usuário RAM |
|
|
Para usar um UID de usuário RAM, adicione o prefixo p4_ . Obtenha o UID na página Usuários do console RAM. Para mais informações sobre formatos de conta, consulte Sistema de contas .
Etapa 2: Adicionar o usuário a um grupo
call slpm_grant('{dbname}.[admin|{schemaname}.developer|{schemaname}.writer|{schemaname}.viewer]', '<account>');
Se você já adicionou o usuário a um grupo durante a criação, ignore esta etapa.
Exemplos:
O exemplo a seguir adiciona uma conta Alibaba Cloud ao grupo admin de mydb.
call slpm_grant('mydb.admin', '197006222995xxx');
call slpm_grant('mydb.admin', 'ALIYUN$xxx');
Este exemplo adiciona usuários ao grupo developer do schema public em mydb.
call slpm_grant('mydb.public.developer', '197006222995xxx');
call slpm_grant('mydb.public.developer', 'RAM$mainaccount:subuser');
O exemplo abaixo adiciona um usuário ao grupo viewer do schema lisa em MYDB (nome de banco de dados sensível a maiúsculas e minúsculas).
call slpm_grant('"MYDB.lisa.viewer"', '197006222995xxx');
call slpm_grant('mydb.lisa.viewer', '"xxx@aliyun.com"');
Remover um usuário de um grupo
Remover um usuário de um grupo revoga todas as permissões associadas a esse grupo.
call slpm_revoke('{dbname}.[admin|{schemaname}.developer|{schemaname}.writer|{schemaname}.viewer]', '<account>');
Exemplos:
O exemplo a seguir remove usuários do grupo admin de dbname.
call slpm_revoke('dbname.admin', 'p4_564306222995xxx');
call slpm_revoke('dbname.admin', '197006222995xxx');
call slpm_revoke('dbname.admin', '"xxx@aliyun.com"');
Este exemplo remove um usuário RAM do grupo developer do schema lisa em mydb.
call slpm_revoke('mydb.lisa.developer', 'RAM$mainaccount:subuser');
call slpm_revoke('mydb.public.developer', 'p4_564306222995xxx');
O exemplo abaixo remove um usuário RAM do grupo viewer de SCHEMA1 em MYDB (nomes sensíveis a maiúsculas e minúsculas).
call slpm_revoke('"MYDB.SCHEMA1.viewer"', 'p4_564306222995xxx');
Excluir um usuário
Excluir um usuário o remove da instância e revoga todas as permissões no nível da instância. Esta ação não pode ser desfeita.
DROP ROLE "<account>";
Desativar o SLPM
Etapa 1: Desativar o modelo
Somente um superusuário pode desativar o SLPM.
call slpm_disable ();
Após a desativação:
Os quatro grupos de usuários (
{db}.admin,{db}.{schemaname}.developer,{db}.{schemaname}.writer,{db}.{schemaname}.viewer) mantêm suas permissões nos objetos existentes. As permissões não se estendem a novos objetos.O PUBLIC recebe as seguintes concessões:
USAGEeCREATEno schema public;CONNECTeTEMPORARYno banco de dados;EXECUTEem funções e procedimentos;USAGEem linguagens e tipos de dados (incluindo domínios).O PUBLIC não recebe permissões em tabelas, views, views materializadas, colunas de tabelas, sequências, wrappers de dados externos, servidores externos ou schemas não públicos. Entre em contato com um superusuário para conceder essas permissões individualmente.
Etapa 2: Limpar grupos de usuários (opcional)
Os grupos de usuários não são excluídos automaticamente quando o SLPM é desativado. Para removê-los, chame slpm_cleanup.
Certifique-se de que nenhuma instrução SQL esteja em execução no banco de dados antes de chamarslpm_cleanup. A funçãoslpm_cleanuptransfere a propriedade dos objetos em lotes de 64 (ajustável). Execute-a várias vezes se necessário, mas evite mais de cinco execuções. Para detalhes, consulte slpm_cleanup .
Cenário 1: Excluir grupos de usuários, mas manter o banco de dados.
Execute o seguinte comando no banco de dados alvo como superusuário.
call slpm_cleanup('<dbname>');
Cenário 2: Excluir grupos de usuários após o banco de dados ter sido descartado.
Execute o seguinte comando em outro banco de dados (como postgres) como superusuário.
call slpm_cleanup('mydb');
Reativar o SLPM
-
Limpe as permissões existentes para evitar conflitos.
call slpm_cleanup ( '<dbname>' ); -
Reative o SLPM no modo de recuperação e, em seguida, transfira a propriedade dos objetos.
-- Enable SLPM in recovery mode. call slpm_enable ('t'); -- Transfer ownership of existing objects to the developer group. call slpm_migrate (); Conceda permissões aos usuários. Use
slpm_grantconforme descrito em Conceder permissões ou utilize o console do Hologres. Para detalhes, consulte Conceder permissões a um usuário.
Criar views entre schemas no modo SLPM (Beta)
Views entre schemas exigem Hologres V1.3.36 ou posterior. Se sua instância estiver em uma versão anterior, consulte Erros comuns que ocorrem ao preparar uma atualização de instância ou entre em contato com o suporte via suporte online .
Por padrão, o SLPM não permite views que referenciem tabelas em mais de um schema. O recurso de view entre schemas elimina essa restrição para casos de uso específicos.
Quando usar este recurso
Um padrão comum em data warehouse é organizar os dados em schemas em camadas — por exemplo, operation data store (ODS), DWD, data warehouse service (DWS) e ADS — e depois criar views de resumo em uma camada externa que unem tabelas de várias camadas internas.
Considere o seguinte exemplo, onde uma view no schema ads une tabelas de ods e dwd:
|
Banco de dados |
Schema |
Objeto |
|
|
|
Tabela: |
|
|
|
Tabela: |
|
|
|
View: |
DDL da view:
CREATE VIEW ads.customer_total_order_price_view AS
SELECT
c_name,
sum(o_totalprice)
FROM
ods.orders AS o
INNER JOIN dwd.customer AS c
ON o.o_custkey = c.c_custkey
GROUP BY
1;
Requisitos de permissão
|
Ação |
Permissões necessárias |
|
Criar uma view entre schemas no schema |
|
|
Consultar uma view entre schemas |
|
|
Modificar ou excluir uma view entre schemas |
Deve ser o proprietário da view |
No exemplo acima, para criar ads.customer_total_order_price_view como ads_dev_user:
Conceda a
ads_dev_usera permissãodeveloperemads.Conceda a
ads_dev_usera permissãovieweremodsedwd.
Para permitir que ads_view_user consulte a view, conceda a ads_view_user a permissão viewer em ads.
Ativar o recurso de view entre schemas
Execute o seguinte comando como superusuário.
call slpm_enable_multi_schema_view();
Transferir propriedade da view
Após a ativação do recurso, o usuário que cria uma view torna-se seu proprietário. Somente o proprietário pode modificá-la ou excluí-la. Para transferir a propriedade — por exemplo, antes de remover um usuário do banco de dados — execute o seguinte comando. O novo proprietário deve ter permissão developer no schema da view e viewer ou superior em todos os schemas de source.
-- Syntax
call slpm_alter_view_owner('view_name', '<account>');
-- Example: transfer ownership of ads.customer_total_order_price_view to p4_xxxxx.
call slpm_alter_view_owner('ads.customer_total_order_price_view', 'p4_xxxxx');
Desativar o recurso de view entre schemas
-- Disable cross-schema view support.
call slpm_disable_multi_schema_view();
-- Transfer all view ownership back to the developer group of each view's schema.
call slpm_migrate();
Após executar esses comandos, as views existentes que não são entre schemas permanecem consultáveis e o SLPM comporta-se normalmente. Views entre schemas não poderão mais ser consultadas.
Próximos passos
Funções do modelo de permissão no nível de schema — referência completa para todas as funções do SLPM, incluindo detalhes de parâmetros
Visão geral do modelo de permissão no nível de schema — tabela de referência de permissões de grupos de usuários