所有命令都必须在连接到正确的数据库集群时执行。一定要确保。
角色是数据库集群的对象。同一集群中的所有数据库共享已定义的角色集。根据数据库/模式/表等授予/撤销特权。
显然,角色需要访问数据库。默认情况下,它被授予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 pg_read_all_data TO my_user;
GRANT pg_write_all_data TO my_user;
这涵盖了所有基本的DML命令(但不包括DDL,也不包括一些特殊的命令,如TRUNCATE或函数的EXECUTE特权!)。手册:
pg_read_all_data
Read all data (tables, views, sequences), as if having SELECT rights
on those objects, and USAGE rights on all schemas, even without
having it explicitly. This role does not have the role attribute
BYPASSRLS set. If RLS is being used, an administrator may wish to
set BYPASSRLS on roles which this role is GRANTed to.
pg_write_all_data
Write all data (tables, views, sequences), as if having INSERT,
UPDATE, and DELETE rights on those objects, and USAGE rights on
all schemas, even without having it explicitly. This role does not
have the role attribute BYPASSRLS set. If RLS is being used, an
administrator may wish to set BYPASSRLS on roles which this role is
GRANTed to.
不使用预定义角色的所有权限(任何Postgres版本)
命令必须在连接到正确的数据库时执行。一定要确保。
角色(至少)需要模式上的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;
或者,您可以使用pgAdmin 4的“Grant Wizard”来处理GUI。
这涵盖了现有对象的特权。要覆盖未来对象,请设置DEFAULT PRIVILEGES。看到的:
在PostgreSQL中为特定的数据库授予权限
如何管理默认特权的用户在数据库vs SCHEMA?
还有一些其他对象,GRANT的手册有完整的列表。截至Postgres 14:
数据库对象(表、列、视图、外部表、序列、数据库、外部数据包、外部服务器、函数、过程、过程语言、模式或表空间)上的特权
但剩下的就很少需要了。更多的细节:
在PostgreSQL中为特定的数据库授予权限
如何授予视图上的所有特权给任意用户
考虑升级到当前版本。