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 individualmente por tabela, o SLPM organiza os usuários em grupos integrados — admin, developer, writer e viewer — e aplica as permissões automaticamente no nível do schema. Basta adicionar o usuário ao grupo apropriado; não é necessário executar instruções GRANT ou ALTER DEFAULT PRIVILEGES.
Esta página explica 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 pontos abaixo:
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 pelo SLPM. Para uma exceção disponível na V1.3.36 e posteriores, consulte Create cross-schema views in SLPM mode (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 ao adicionar usuários aos grupos.
slpm_grantrevokeAs permissões são revogadas ao remover 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.
Ative 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)
Ative o SLPM para um banco de dados
-
Instale a extensão SLPM. Execute esta etapa uma única 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 rodar este comando.
call slpm_enable (); -
(Opcional) Migre 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.
Para verificar qual modelo de permissão está ativo antes de migrar:
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 ();
Conceda permissões
As permissões do SLPM são concedidas ao adicionar usuários a grupos. 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 User groups and permissions in SLPM.
Etapa 1: Crie 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 o 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 Account system .
Etapa 2: Adicione 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"');
Remova um usuário de um grupo
Ao remover um usuário de um grupo, todas as permissões associadas a esse grupo são revogadas.
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');
Exclua um usuário
A exclusão de 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>";
Desative o SLPM
Etapa 1: Desative 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: Limpe os 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: Exclua os grupos de usuários, mas mantenha o banco de dados.
Execute o seguinte comando no banco de dados alvo como superusuário.
call slpm_cleanup('<DBNAME>');
Cenário 2: Exclua os grupos de usuários após a exclusão do banco de dados.
Execute o seguinte comando em outro banco de dados (como postgres) como superusuário.
call slpm_cleanup('mydb');
Reative 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 Grant permissions ou utilize o console do Hologres. Para detalhes, consulte Grant permissions.
Crie 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 Common errors that occur when you prepare for an instance upgrade ou entre em contato com o suporte via online support .
Por padrão, o SLPM não permite views que referenciem tabelas em mais de um schema. O recurso de view entre schemas remove 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 |
Permissão |
|
Consultar uma view entre schemas |
Permissão |
|
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.
Após alternar do modelo de permissão simples (SPM) para o SLPM, as views entre schemas existentes tornam-se inacessíveis e as consultas falham com o erro permission denied for table. Execute o seguinte comando como superusuário para ativar o recurso de view entre schemas e, em seguida, recrie as views entre schemas existentes:
call slpm_enable_multi_schema_view();
-- Re-create the cross-schema view
CREATE OR REPLACE VIEW schema_b.cross_schema_view AS
SELECT a.id, a.name, b.value
FROM schema_a.table_a a
JOIN schema_b.table_b b ON a.id = b.id;
Ativar o recurso isoladamente, sem recriar as views, não resolve o erro de permissão.
Ative o recurso de view entre schemas
Execute o seguinte comando como superusuário.
call slpm_enable_multi_schema_view();
Transfira a propriedade da view
Depois que o recurso é ativado, 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');
Desative 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. As views entre schemas não poderão mais ser consultadas.
Próximos passos
SLPM functions — referência completa para todas as funções do SLPM, incluindo detalhes de parâmetros
User groups and permissions in SLPM — referência rápida para as permissões de cada grupo de usuários