关系 <table> 的权限被拒绝

if *_*one 22 postgresql permissions

我在 psql 中运行了以下 SQL:

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
);
Run Code Online (Sandbox Code Playgroud)

当我以 身份登录bspu并尝试查询users表时,出现错误:

permission denied for relation users
Run Code Online (Sandbox Code Playgroud)

我尝试运行:

ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO bspu;
Run Code Online (Sandbox Code Playgroud)

但它没有帮助。我究竟做错了什么?为什么数据库所有者没有权限查询自己的数据库?

编辑:我bspu现在升级为超级用户,所以我可以继续工作。任何进一步的指导表示赞赏。

Erw*_*ter 35

DEFAULT PRIVILEGES千万不能更改权限,现有的对象。它们是新创建的对象的默认权限,并且仅适用于它们所属的特定角色。如果运行时不指定角色ALTER DEFAULT PRIVILEGES,则默认为当前角色(执行ALTER DEFAULT PRIVILEGES语句时。

此外,由于您使用的是serial创建的列,因此SEQUENCE您还需要为序列设置默认权限。

运行CREATE命令之前您创建对象的用户上运行此命令:

ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON TABLES TO bspu;
ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON SEQUENCES TO bspu;
Run Code Online (Sandbox Code Playgroud)

对 pgAdmin 用户的警告。pgAdmin III 和 pgAdmin4(包括 v5.3)的所有版本都有一个错误。数据库或模式节点的反向工程 SQL 脚本显示DEFAULT PRIVILEGES忽略拥有用户,因此在某些情况下是不正确的。我报告了这个错误(反复),但该项目在修复它时遇到了困难。pgAdmin III 被停止支持 pgAdmin4。该错误仍然存​​在于 pgAdmin4 中。

对于现有对象,您可能还对GRANT命令的这种“批处理”形式感兴趣:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO bspu;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO bspu;
Run Code Online (Sandbox Code Playgroud)

更多关于SO的相关问题: