Eu executei o seguinte SQL no psql:
CREATE USER bspu LOGIN;
CREATE DATABASE bsp OWNER bspu;
GRANT ALL PRIVILEGES ON DATABASE bsp TO bspu;
\c bsp
CREATE TABLE users (
id SERIAL PRIMARY KEY,
client_id VARCHAR(20) NOT NULL,
api_key VARCHAR(100) NOT NULL,
api_secret VARCHAR(100) NOT NULL,
auth_token VARCHAR(128) NOT NULL
);
Quando faço login como bspu
e tento consultar a users
tabela, recebo o erro:
permission denied for relation users
Tentei executar:
ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO bspu;
Mas isso não ajuda. O que estou fazendo errado? Por que o proprietário do banco de dados NÃO tem permissões para consultar seu próprio banco de dados?
EDIT: atualizei bspu
para superusuário por enquanto, para poder continuar trabalhando. Qualquer orientação adicional apreciada.
DEFAULT PRIVILEGES
não altere as permissões para objetos existentes . Eles são os privilégios padrão para objetos recém-criados e apenas para a função específica a que pertencem. Se você não especificar a função ao executarALTER DEFAULT PRIVILEGES
, o padrão será a função atual (ao executar aALTER DEFAULT PRIVILEGES
instrução.Além disso, como você está usando uma
serial
coluna, que cria umSEQUENCE
, convém definir também os privilégios padrão para as sequências.Execute isso no usuário com o qual você cria objetos, antes de executar o
CREATE
comando:Uma palavra de cautela para os usuários do pgAdmin. Há um bug em todas as versões do pgAdmin III e pgAdmin4 (incluindo v5.3). O script SQL de engenharia reversa para os nós do banco de dados ou do esquema é exibido
DEFAULT PRIVILEGES
ignorando o usuário proprietário e, portanto, está incorreto em determinadas situações. Relatei o bug (repetidamente) , mas o projeto encontrou dificuldades para corrigi-lo. pgAdmin III foi descontinuado em favor de pgAdmin4. O bug ainda está lá no pgAdmin4.Para objetos existentes , você também pode estar interessado nesta forma de "lote" do
GRANT
comando :Mais sob esta pergunta relacionada no SO:
Se o erro
aparece ao tentar fazer uma GRANT ACTION,
garantir que a GRANT seja realizada pelo usuário proprietário das respectivas tabelas. O proprietário dos esquemas pode variar em um banco de dados. Mesmo o usuário postgres não terá permissão para fornecer este acesso GRANT.