授权使用/选择单个表
如果您只授予数据库的CONNECT权限,用户可以连接但没有其他权限。您必须分别授予命名空间(模式)上的USAGE和表和视图上的SELECT权限,如下所示:
GRANT CONNECT ON DATABASE mydb TO xxx;
GRANT USAGE ON SCHEMA public TO xxx;
GRANT SELECT ON mytable TO xxx;
多表/视图 (PostgreSQL 9.0+)
在最新版本的PostgreSQL中,您可以使用单个命令对模式(schema)中的所有表/视图等授予权限,而不必一个一个地输入:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;
这只对已经创建的表有影响。更强大的是,您可以自动将默认角色分配给未来的对象:
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO xxx;
请注意,默认情况下,此命令只会影响由发出此命令的用户创建的对象(表):尽管它也可以设置在该发出用户是成员的任何角色上。但是,当创建新对象时,您不会为所有成员角色获取默认权限...因此仍需要一些麻烦。如果您采用数据库具有拥有角色,并且模式更改是以该拥有角色执行的方法,则应将默认权限分配给该拥有角色。在我看来,这有点混乱,您可能需要进行实验以找到一个功能性的工作流程。
多个表/视图(PostgreSQL版本9.0之前)
为了避免在长时间的多表更改中出现错误,建议使用以下“自动”过程生成所需的GRANT SELECT
以赋予每个表/视图:
SELECT 'GRANT SELECT ON ' || relname || ' TO xxx;'
FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE nspname = 'public' AND relkind IN ('r', 'v', 'S');
以下代码将输出在public schema下,授予SELECT权限的GRANT命令,适用于所有表格、视图和序列。注意这只会应用于已经创建的表格。
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
操作。如果没有这个操作,“只读”用户无法修改现有表,但可以在模式中创建新表并向这些表添加/删除数据。 - Ajedi32psql mydb
命令来启动控制台,否则大部分操作都不能进行。对我个人而言,花费了相当长的时间才弄清楚如何操作。希望这能帮助到其他人。 - Anas