【问题标题】:PostgreSQL and privilegesPostgreSQL 和权限
【发布时间】:2015-04-25 22:24:52
【问题描述】:

PostgreSQL 中新关系的权限如何工作?

步骤:

  1. 创建数据库(从用户 postgres)并连接到它

CREATE DATABASE test; \c test

  1. 创建具有某些权限的用户站点

CREATE USER site NOCREATEDB NOINHERIT; GRANT SELECT, UPDATE, INSERT, DELETE, TRUNCATE, REFERENCES ON ALL TABLES IN SCHEMA public TO site; GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO site;

  1. 更改用户 site 的默认权限

ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, UPDATE, INSERT, DELETE, TRUNCATE, REFERENCES ON TABLES TO site;

  1. 创建具有所有权限的用户迁移

CREATE USER migration NOCREATEDB NOINHERIT; GRANT ALL PRIVILEGES ON DATABASE test TO migration;

  1. 从用户迁移连接到数据库并创建表

CREATE TABLE test (id serial);

  1. 从用户站点连接到数据库并从创建的表中选择数据

SELECT * FROM test; ERROR: permission denied for relation test

但如果我从用户 postgres 创建表,一切正常!

为什么默认权限在这种情况下不起作用?如何为用户 site 授予新表的权限?

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    ALTER DEFAULT PRIVILEGES 只影响FOR ROLE 子句中指定的用户创建的对象。如果您省略此子句,则它仅适用于运行命令的用户(在您的情况下为 postgres)。

    你想要ALTER DEFAULT PRIVILEGES FOR USER migration ...

    【讨论】:

    • 谢谢!它有帮助,但在此更改后,用户 site 可以更改表模式并删除表:test=> SELECT * FROM test ;id ----(0 rows)test=> ALTER TABLE test ADD column test_column char(1);ALTER TABLEtest=> DROP TABLE test;DROP TABLE跨度>
    • ALTER / DROP 无法授予权限。它们只对表所有者可用(当然还有像 postgres 这样的超级用户)。如果允许 site 删除表,则 site 是创建它的人。我认为您从错误的会话中运行了部分测试脚本。
    猜你喜欢
    • 2014-10-30
    • 2018-05-07
    • 2016-12-08
    • 2014-08-07
    • 2014-05-08
    • 2012-03-15
    • 2021-05-05
    • 2012-02-03
    相关资源
    最近更新 更多