必须在连接到正确的数据库集群时执行所有命令。确保它。
角色是数据库集群的对象。同一集群的所有数据库共享一组定义的角色。根据数据库/模式/表等授予/撤销权限。
显然,角色需要访问数据库。默认情况下授予PUBLIC。其他:
GRANT CONNECT ON DATABASE my_db TO my_user;
Postgres 14 或更高版本的基本权限
Postgres 14 添加了预定义的非登录角色pg_read_all_data / pg_write_all_data。
他们拥有所有表、视图和序列的SELECT/INSERT、UPDATE、DELETE权限。加上USAGE 模式。我们可以GRANT 成为这些角色的成员:
GRANT pg_read_all_data TO my_user;
GRANT pg_write_all_data TO my_user;
这涵盖了所有基本的 DML 命令(但不包括 DDL,也不包括一些特殊命令,如 TRUNCATE 或 EXECUTE 函数权限!)。 The manual:
pg_read_all_data
读取所有数据(表、视图、序列),好像拥有SELECT 权限
在这些对象上,以及对所有模式的USAGE 权限,即使没有
明确地拥有它。此角色没有角色属性
BYPASSRLS 设置。如果正在使用 RLS,管理员可能希望
将 BYPASSRLS 设置为该角色是 GRANTed 的角色。
pg_write_all_data
写入所有数据(表、视图、序列),好像有INSERT,
UPDATE 和 DELETE 对这些对象的权限,以及 USAGE 对这些对象的权限
所有模式,即使没有明确的。这个角色不
设置角色属性BYPASSRLS。如果正在使用 RLS,则
管理员可能希望在该角色所在的角色上设置BYPASSRLS
GRANTed to。
不使用预定义角色的所有权限(任何 Postgres 版本)
必须在连接到正确的数据库时执行命令。确保它。
角色需要(至少)schema 上的USAGE 权限。同样,如果授予PUBLIC,您将获得保障。其他:
GRANT USAGE ON SCHEMA public TO my_user;
或在所有自定义架构上授予USAGE:
DO
$$
BEGIN
-- RAISE NOTICE '%', ( -- use instead of EXECUTE to see generated commands
EXECUTE (
SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
FROM pg_namespace
WHERE nspname <> 'information_schema' -- exclude information schema and ...
AND nspname NOT LIKE 'pg\_%' -- ... system schemas
);
END
$$;
然后,所有表的所有权限(需要 Postgres 9.0 或更高版本)。
不要忘记序列(如果有的话):
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;
或者,您可以使用 "Grant Wizard" of pgAdmin 4 来使用 GUI。
这包括现有对象的权限。要同时涵盖未来的对象,请设置DEFAULT PRIVILEGES。见:
还有一些其他的对象,the manual for GRANT 有完整的列表。从 Postgres 14 开始:
对数据库对象(表、列、视图、外部表、序列、数据库、外部数据包装器、外部服务器、函数、过程、过程语言、模式或表空间)的特权
但其余部分很少需要。更多详情:
考虑upgrading to a current version。