Versão rápida:
Que comando devo emitir para permitir que um proprietário de banco de dados permita que ele acesse tabelas neste banco de dados e isso pode ser feito a partir da conta desse proprietário?
Versão mais longa:
Estou criando um banco de dados no RDS. Eu tenho um usuário 'root' que configurei com a Amazon.
A Amazon cria automaticamente a função de grupo 'rds_superuser', que é muito privilegiada, mas na verdade não é um superusuário.
Estou criando um banco de dados e um usuário para a aplicação da seguinte forma:
create database master_integration;
CREATE ROLE master_application LOGIN ENCRYPTED PASSWORD '...' VALID UNTIL 'infinity';
GRANT ALL ON DATABASE master_integration TO GROUP rds_superuser WITH GRANT OPTION;
GRANT ALL ON DATABASE master_integration TO GROUP master_application;
\c master_integration;
ALTER DEFAULT PRIVILEGES GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES TO rds_superuser;
Atualizei este script para refletir as sugestões de Craig Ringer sobre como devo lidar com isso.
Quando o aplicativo se conecta (com as credenciais master_application), ele cria (e, portanto, possui) as tabelas.
Meu problema é que não consigo usar meu login administrativo (rootish) para executar consultas porque esse usuário não tem privilégios na tabela.
Consegui resolver isso antes executando o seguinte na conta do aplicativo:
GRANT ALL privileges ON ALL TABLES IN SCHEMA public to rds_superuser;
Mas parece hacky ter um usuário subordinado concedendo privs de volta a um usuário administrativo.
Então... Existe um comando que eu possa executar antes ou depois de criar as tabelas do aplicativo que garantirá que o proprietário do banco de dados possa acessar as tabelas dentro do banco de dados?
atualizar depois de tentar novamente alterar privilégios padrão...
Isso ainda não concede acesso às tabelas; Eu vejo isso sendo sugerido em outro lugar e faz todo o sentido, mas não está funcionando para mim. De um shell psql:
master_integration=> \ddp
Default access privileges
Owner | Schema | Type | Access privileges
------------------+--------+-------+-------------------------------------------
integration_root | | table | integration_root=arwdDxt/integration_root+
| | | rds_superuser=arwdDxt/integration_root
(1 row)
master_integration=> \dp users
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+-------+-------+-------------------+--------------------------
public | users | table | |
(1 row)
Integration_root é meu usuário superusuário e users é uma tabela dentro do meu banco de dados.
Atualizar
Recebi uma resposta bastante inútil de alguém da Amazon.
Eles me pediram para chamar ALTER DEFAULT PRIVILEGES do login master_application. Embora isso provavelmente funcione, não responderia à minha pergunta (que é como faço isso acontecer apenas na conta rds_superuser).
Pedi que esclarecessem isso e eles foram embora.
Você quer
ALTER DEFAULT PRIVILEGES
.Conceda os
rds_superuser
direitos de acesso padrão a todas as novas tabelas.Isso afeta apenas as tabelas criadas após o arquivo
ALTER
. Para tabelas existentes, você deve terGRANT
direitos.O esquema público deve ser visível para todos os usuários. Você não deve restringir os direitos do esquema público a apenas um grupo.
Então, se você não usa:
Você pode trabalhar com segurança com o esquema público com todas as contas.
Se você não quiser que contas específicas baguncem suas tabelas de esquema público, crie uma nova função (para usuários do seu aplicativo) e revogue os direitos dessa função específica dentro do esquema público. Algo como:
Não o contrário quando você tenta fazer isso.