将使用/选择授予单个表
如果您只将 CONNECT 授予数据库,则用户可以连接但没有其他权限。您必须在命名空间(模式)上授予 USAGE 并在表和视图上分别授予 SELECT ,如下所示:
GRANT CONNECT ON DATABASE mydb TO xxx;
-- This assumes you're actually connected to mydb..
GRANT USAGE ON SCHEMA public TO xxx;
GRANT SELECT ON mytable TO xxx;
多个表/视图(PostgreSQL 9.0+)
在最新版本的 PostgreSQL 中,您可以使用单个命令授予架构中所有表/视图/等的权限,而不必一一键入:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;
这只影响已经创建的表。更强大的是,你以后可以自动拥有default roles assigned to new objects:
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');
这应该将相关的 GRANT 命令输出到公开的所有表、视图和序列上的 GRANT SELECT,以便进行复制粘贴。当然,这只会应用于已经创建的表。