对当前对象的权限
要对表进行读/写访问,您需要使用GRANT command https://www.postgresql.org/docs/current/static/sql-grant.html分 3 个级别:
- DATABASE
- SCHEMA
- 表、函数、序列等
首先,你需要CONNECT
数据库权限:
GRANT CONNECT ON DATABASE <dbname> TO <username>;
其次,你需要USAGE
数据库内模式的特权(您必须在运行之前连接到数据库):
GRANT USAGE ON SCHEMA <schemaname> TO <username>;
最后,您可以授予对表的权限,假设您希望对架构中的所有表进行通用 DML 和 SELECT,以及其他权限:
GRANT SELECT,INSERT,UPDATE,DELETE ON ALL TABLES IN SCHEMA <schemaname> TO <username>;
-- and the sequences, for INSERT to work
GRANT USAGE ON ALL SEQUENCES IN SCHEMA <schemaname> TO <username>;
-- and the functions
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA <schemaname> TO <username>;
将来创建的对象的默认权限
你现在必须注意到一些事情。每个数据库、每个模式以及每个对象(表、函数等)都有一个所有者。的所有者是将在其上管理和运行 DDL 命令的用户。一般来说,您应该在以拥有一切的用户身份连接时运行上述所有命令,因为该用户已经拥有所有权限(您可以使用SUPERUSER
也是如此,但我建议仅将其保留用于 DBA 任务)。
以上GRANT ... ON ALL ... IN SCHEMA
命令将为数据库中已存在的对象授予权限,但不适用于创建的新对象。为此,您可以使用ALTER DEFAULT PRIVILEGES(我将称之为ADP) 命令 https://www.postgresql.org/docs/current/static/sql-alterdefaultprivileges.html。和以前一样,您应该在以所有者身份连接时运行它,因为您必须记住,仅当新对象的所有者与此处使用的所有者匹配(或在FOR ROLE clause https://www.postgresql.org/docs/current/static/sql-alterdefaultprivileges.html):
ALTER DEFAULT PRIVILEGES IN SCHEMA <schemaname>
GRANT SELECT,INSERT,UPDATE,DELETE ON TABLES TO <username>;
-- and the sequences, for INSERT to work
ALTER DEFAULT PRIVILEGES IN SCHEMA <schemaname>
GRANT USAGE ON SEQUENCES TO <username>;
-- and the functions
ALTER DEFAULT PRIVILEGES IN SCHEMA <schemaname>
GRANT EXECUTE ON FUNCTIONS TO <username>;
您也可以跳过IN SCHEMA <schemaname>
并将其应用于您将来拥有或创建的任何模式。但话又说回来,当心,即使您不提供FOR ROLE <rolename>
这意味着它将适用于当前用户已连接,所以只有创建的对象属于该对象<rolename>
将考虑 ADP 命令。
为了更好地管理权限,我强烈建议您密切关注哪个用户拥有这些对象。在大多数情况下,我还建议您为数据库中的所有内容只保留一个所有者(除非您是高级用户并且知道自己在做什么),这样权限管理会更容易。