Você encontrou o atalho para definir privilégios para todas as tabelas existentes no esquema fornecido. O manual esclarece :
(mas observe que isso ALL TABLES
inclui visualizações e tabelas estrangeiras ).
Ênfase em negrito minha. serial
colunas são implementadas com nextval()
uma sequência como padrão de coluna e, citando o manual :
Para sequências, este privilégio permite o uso das funções currval
e nextval
.
Então, se houver serial
colunas, você também vai querer conceder USAGE
(ou ALL PRIVILEGES
) em sequências
GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp;
Nota: as colunas de identidade no Postgres 10 ou posterior usam sequências implícitas que não requerem privilégios adicionais. (Considere atualizar as serial
colunas.)
E quanto a novos objetos?
Você também terá interesse em DEFAULT PRIVILEGES
para usuários ou esquemas :
ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT USAGE ON SEQUENCES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo REVOKE ...;
Isso define privilégios para objetos criados no futuro automaticamente - mas não para objetos pré-existentes.
Os privilégios padrão são aplicados apenas a objetos criados pelo usuário de destino ( FOR ROLE my_creating_role
). Se essa cláusula for omitida, o padrão é o usuário atual em execução ALTER DEFAULT PRIVILEGES
. Para ser explícito:
ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo GRANT ...;
ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo REVOKE ...;
Observe também que todas as versões do pgAdmin III têm um bug sutil e exibem privilégios padrão no painel SQL, mesmo se eles não se aplicarem à função atual. Certifique-se de ajustar a FOR ROLE
cláusula manualmente ao copiar o script SQL.
ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;
como ele sabe qual banco de dados?SCHEMA foo
pode existir em banco de dados diferente?Minha resposta é semelhante a esta em ServerFault.com .
Para ser conservador
Se você quiser ser mais conservador do que conceder "todos os privilégios", pode tentar algo mais parecido com isso.
O uso de
public
lá se refere ao nome do esquema padrão criado para cada novo banco de dados / catálogo. Substitua pelo seu próprio nome se você criou um esquema.Acesso ao Esquema
Para acessar um esquema, para qualquer ação, o usuário deve receber direitos de "uso". Antes que um usuário possa selecionar, inserir, atualizar ou excluir, ele deve primeiro ter o "uso" concedido a um esquema.
Você não perceberá este requisito ao usar o Postgres pela primeira vez. Por padrão, cada banco de dados possui um primeiro esquema denominado
public
. E cada usuário, por padrão, recebeu automaticamente direitos de "uso" para esse esquema específico. Ao adicionar um esquema adicional, você deve conceder direitos de uso explicitamente.Trecho do documento Postgres :
Para obter mais discussão, consulte a pergunta, o que exatamente o uso de concessão no esquema faz? . Preste atenção especial à resposta do especialista em Postgres Craig Ringer .
Objetos Existentes Versus Futuro
Esses comandos afetam apenas objetos existentes. As tabelas e outras que você criar no futuro terão privilégios padrão até que você execute novamente as linhas acima. Veja a outra resposta de Erwin Brandstetter para alterar os padrões que afetam os objetos futuros.
fonte