所有命令必须在连接到正确的数据库集群时执行。请确保这一点。
角色是数据库集群的对象。同一集群中的所有数据库共享定义的角色集。权限是按数据库/模式/表等授予/撤销的。
显然,角色需要访问数据库。默认情况下,这是授予给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
权限!)。
手册:
pg_read_all_data
读取所有数据(表、视图、序列),就像对这些对象具有SELECT
权限和所有模式的USAGE
权限一样,即使没有明确声明。该角色没有设置BYPASSRLS
角色属性。如果使用了RLS,则管理员可能希望在授予此角色的角色上设置BYPASSRLS
。
pg_write_all_data
写入所有数据(表、视图、序列),就像对这些对象具有INSERT
、UPDATE
和DELETE
权限和所有模式的USAGE
权限一样,即使没有明确声明。该角色没有设置BYPASSRLS
角色属性。如果使用了RLS,则管理员可能希望在授予此角色的角色上设置BYPASSRLS
。
不使用预定义角色的所有权限(任何Postgres版本)
命令必须在连接到正确的数据库时执行。请确保。
该角色需要对模式具有(至少)USAGE
权限。同样,如果授予了PUBLIC
,则已经涵盖。否则:
GRANT USAGE ON SCHEMA public TO my_user;
或者在所有自定义模式上授予 USAGE
权限:
DO
$$
BEGIN
EXECUTE (
SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
FROM pg_namespace
WHERE nspname <> 'information_schema'
AND nspname NOT LIKE 'pg\_%'
);
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;
或者,您可以使用 pgAdmin 4 的 "Grant Wizard" 来使用 GUI。
这涵盖了现有对象的权限。为了覆盖未来的对象,请设置 DEFAULT PRIVILEGES
。请参见:
还有一些其他对象,GRANT 的手册 包含完整列表。截至 Postgres 14:
{数据库对象(表、列、视图、外部表、序列、数据库、外部数据包装器、外部服务器、函数、过程、过程语言、模式或表空间)的权限}
但是很少需要其余的细节:
考虑
升级到当前版本。