对当前对象的权限
要拥有对表的读/写权限,您需要在 3 个级别使用GRANT command:
- 数据库
- 架构
- 表格、函数、序列等
首先,您需要数据库的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 (I'll call it ADP) command。和以前一样,您应该在以所有者身份连接时运行它,因为您必须记住,只有当新对象的所有者与此处使用的所有者匹配(或在 FOR ROLE clause 中设置)时才会应用 ADP:
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>,这意味着它将应用于当前连接的用户,因此只有创建的对象属于该@ 987654338@会考虑ADP命令。
为了更好地管理权限,我强烈建议您留意哪些用户拥有这些对象。在大多数情况下,我还建议您只为数据库中的所有内容保留一个所有者(除非您是高级用户并且知道自己在做什么),这样权限管理会更容易。