无法以非超级用户身份在公共模式中创建表
postgres - 超级用户。
我做了什么:
ALTER SCHEMA public owner to postgres;
CREATE USER admin WITH PASSWORD 'my-password';
GRANT USAGE, CREATE ON SCHEMA public TO postgres;
GRANT USAGE, CREATE ON SCHEMA public TO admin;
CREATE DATABASE mydb;
GRANT ALL ON DATABASE mydb TO admin;
特权:
postgres=# \dn+
List of schemas
Name | Owner | Access privileges | Description
--------+----------+----------------------+------------------------
public | postgres | postgres=UC/postgres+| standard public schema
| | =UC/postgres +|
| | admin=UC/postgres |
(1 row)
我得到了什么:
如何在公共模式中创建表?
PostgreSQL 15 还撤销所有用户
的CREATE
权限,除了(或默认)架构中的数据库所有者。
public
您的修复不起作用的原因是您对数据库
postgres
执行的所有关于用户 admin
对架构 public
的权限的操作仅涉及数据库 postgres
中的该架构。数据库 public
上的架构 postgres
与新创建的 public
上的架构 mydb
不同。
还有这个:
GRANT ALL ON DATABASE mydb TO admin;
授予数据库本身的权限,而不是数据库内的权限。例如,
admin
现在可以删除数据库,但仍然无法在模式 public
中创建表。我的猜测是您想让 admin
也成为 mydb
的所有者,在这种情况下您需要添加
ALTER DATABASE mydb OWNER TO admin;
或者您需要在
GRANT USAGE, CREATE ON SCHEMA public TO admin;
上重复您的 mydb
。
这里有一些关于 安全模式使用模式 PostgreSQL 15 更改所基于的更多文档。
您已在授予public
模式的权限后
创建了数据库。您的
admin
用户可能正在使用新的数据库,该数据库仅具有默认权限
//脚本.sql
\c postgres; // adding this line was the fix
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE USER test PASSWORD 'test' NOSUPERUSER CREATEDB CREATEROLE INHERIT;
GRANT CONNECT ON DATABASE postgres TO test;
GRANT USAGE ON SCHEMA public TO test;
GRANT CREATE ON SCHEMA public TO test;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO test;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO test;
SELECT pg_catalog.has_schema_privilege('test', 'public', 'USAGE') AS has_usage,pg_catalog.has_schema_privilege('test', 'public', 'CREATE') AS has_create;`