Eu quero ter vários usuários capazes de criar esquemas e tabelas. Esses esquemas (e tabelas) devem estar disponíveis para todos. Eu gostaria de configurar o banco de dados, com todas as permissões em vigor (e permissões futuras usando ALTER DEFAULT PRIVILEGES). Os usuários não devem ter que alterar nenhuma permissão posteriormente.
Os esquemas são criados usando um software cliente, QGIS neste caso. Assim, os usuários só podem emitir arquivos CREATE SCHEMA newschemaname
.
O problema é que, mesmo que os usuários pertençam ao mesmo grupo, eles não conseguem ver os esquemas uns dos outros.
Não é possível acessar os esquemas de outros
Estou usando dois papéis para teste. Usuários admin1
e admin2
, ambos pertencentes a grp_admin
:
CREATE ROLE grp_admin NOLOGIN;
-- one user should be able to create db and extensions; these permissions are not inherited
CREATE ROLE admin1 WITH PASSWORD 'test2k19' LOGIN inherit SUPERUSER CREATEDB CREATEROLE;
GRANT grp_admin TO admin1;
CREATE ROLE admin2 WITH PASSWORD 'test2k19' LOGIN inherit;
GRANT grp_admin TO admin2;
Como admin1
, criei um novo banco de dados e concedi algumas permissões (e também permissão para objetos futuros):
CREATE DATABASE people;
\c people
-- To create schemas and tables
GRANT ALL PRIVILEGES ON DATABASE people TO grp_admin;
ALTER DEFAULT PRIVILEGES GRANT select, INSERT, UPDATE, DELETE, TRUNCATE ON TABLES TO grp_admin;
ALTER DEFAULT PRIVILEGES GRANT USAGE, SELECT, UPDATE ON SEQUENCES TO grp_admin;
ALTER DEFAULT PRIVILEGES GRANT EXECUTE ON FUNCTIONS TO grp_admin;
Se, como usuário, admin1
eu crio um novo esquema e tabela, o outro admin2
não tem acesso a ele:
create schema archive;
create table archive.vip ( thename varchar);
insert into archive.vip values ('Fernão de Magalhães');
Como admin2
:
select * from archive.vip;
ERROR: 42501: permission denied for schema archive
LINE 1: select * from archive.vip;
Capaz de acessar os esquemas de outros
Se eu usar authorization grp_admin
ao criar o esquema, funciona. Como usuário admin1
:
create schema future authorization grp_admin;
create table future.vip ( thename varchar);
insert into future.vip values ('Robot 5126');
Como usuário admin2
:
select * from future.vip;
thename
------------
Robot 5126
O problema
Como os usuários estão criando esquemas com o QGIS (um aplicativo cliente), emitindo apenas CREATE SCHEMA newschemaname
, os usuários não podem compartilhar esquemas e tabelas entre si.
Como posso ter esse segundo admin2
acessando os admin1
esquemas criados? (Sem emitir permissões GRANT após cada esquema criado).
Você esqueceu de definir privilégios padrão para esquemas: