Todos os produtos
Search
Central de documentação

Hologres:Usando o modelo de permissão no nível de schema

Última atualização: Jun 28, 2026

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 xx

    Todas as tabelas pertencem automaticamente ao grupo developer do schema.

    Não necessário.

    grant

    As permissões são concedidas adicionando usuários aos grupos.

    slpm_grant

    revoke

    As permissões são revogadas removendo usuários dos grupos.

    slpm_revoke

    alter default privileges

    Novas tabelas herdam permissões automaticamente com base no grupo do usuário.

    Não necessário.

    create / drop / alter / rename em grupos de usuários padrão

    Os quatro grupos padrão são gerenciados pelo sistema.

    Não aplicável.

    rename schema

    A renomeação de schemas deve passar pelo SLPM para manter a consistência das vinculações de grupos.

    slpm_rename_schema

    drop database

    Os grupos de usuários devem ser limpos após a exclusão de um banco de dados.

    Execute drop database e, em seguida, chame slpm_cleanup('<dbname>').

  • Nomes de contas personalizadas não podem terminar com admin, developer, writer, viewer ou all_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

  1. Instale a extensão SLPM. Execute esta operação uma vez por banco de dados.

    create extension slpm;
  2. 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 ();
  3. (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.

    1. Faça login no console do Hologres. No painel de navegação à esquerda, clique em Go to HoloWeb.

    2. Clique em Security Center. Na página DB Authorization, verifique o modelo de permissão atual.

    A função slpm_migrate processa 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

admin

{dbname}.admin

Administração do banco de dados

developer

{dbname}.{schemaname}.developer

Leitura e escrita, DDL

writer

{dbname}.{schemaname}.writer

Leitura e escrita

viewer

{dbname}.{schemaname}.viewer

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

197006222995xxx

Caixa de correio Alibaba Cloud

ALIYUN$xxx ou "xxx@aliyun.com" (entre aspas duplas)

"xxx@aliyun.com"

Usuário RAM

RAM$mainaccount:subuser

RAM$mycompany:alice

UID de usuário RAM

p4_UID

p4_564306222995xxx

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: USAGE e CREATE no schema public; CONNECT e TEMPORARY no banco de dados; EXECUTE em funções e procedimentos; USAGE em 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 chamar slpm_cleanup . A função slpm_cleanup transfere 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

  1. Limpe as permissões existentes para evitar conflitos.

    call slpm_cleanup ( '<dbname>' );
  2. 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 ();
  3. Conceda permissões aos usuários. Use slpm_grant conforme 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

erp_db

ods

Tabela: orders

erp_db

dwd

Tabela: customer

erp_db

ads

View: customer_total_order_price_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 ads

developer em ads, além de viewer ou superior em todas as tabelas usadas na view

Consultar uma view entre schemas

viewer ou superior no schema onde a view reside

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_user a permissão developer em ads.

  • Conceda a ads_dev_user a permissão viewer em ods e dwd.

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