Versão rápida:
Qual comando devo emitir para permitir que um proprietário de banco de dados permita acessar tabelas nesse 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 'raiz' 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 o aplicativo da seguinte maneira:
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 sugestões de Craig Ringer sobre como eu deveria lidar com isso.
Quando o aplicativo se conecta (com as credenciais master_application), ele cria (e, portanto, é o proprietário) das tabelas.
Meu problema é que não consigo usar meu logon administrativo (raiz) 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 conceder privs de volta a um usuário administrativo.
Então ... Existe um comando que eu possa executar antes ou depois de criar as tabelas a partir do aplicativo que garantirá que o proprietário do banco de dados possa acessar as tabelas no banco de dados?
atualizar após tentar novamente os privilégios padrão de alteração ...
Isso ainda não concede acesso às tabelas; Eu vejo isso sendo sugerido em outro lugar e faz todo sentido, mas não está funcionando para mim. Em 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-ish e users é uma tabela dentro do meu banco de dados.
Atualizar
Eu recebi uma resposta bastante inútil de alguém na Amazon.
Eles me pediram para ligar para ALTER PRIVILEGES PADRÃO no login master_application. Embora isso provavelmente funcione, ele não responderia à minha pergunta (que é como eu faço isso acontecer apenas da conta rds_superuser).
Pedi-lhes para esclarecer isso e eles foram embora.
fonte
ALTER
. Quando você fez isso? Para tabelas existentes, você deveGRANT
direitos.O esquema público deve ser visível por 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 usar:
Você pode trabalhar com segurança com o esquema público em todas as contas.
Se você não deseja que contas específicas atrapalhem suas tabelas de esquema públicas, crie uma nova função (para os usuários do seu aplicativo) e revogue direitos dessa função específica dentro do esquema público. Algo como:
Não o contrário, ao tentar fazer isso.
fonte
GRANT
nunca deve conseguir reduzir os direitos de acesso. Não estou convencido. Observe que os direitos em um esquema também não são herdados por novas tabelas nesse esquema, portanto, ter acesso aopublic
esquema não significa que você possa usar tabelas nele.