问题

我想在PostgreSQL中创建一个用户,只能从特定数据库中执行SELECT.在MySQL中,命令是:

 GRANT SELECT ON mydb.* TO 'xxx'@'%' IDENTIFIED BY 'yyy';
 

PostgreSQL中的等效命令或系列命令是什么?

我试过了...

 postgres=# CREATE ROLE xxx LOGIN PASSWORD 'yyy';
postgres=# GRANT SELECT ON DATABASE mydb TO xxx;
 

但是,您可以在数据库上授予的东西似乎是 CREATE、CONNECT、TEMPORY 和 TEMP。

  最佳答案

python – 赠款使用/选择到单个表

如果只授予数据库CONNECT,用户可以连接,但没有其他特权.您必须在名称空间(模式)和SELECT上单独授予USAGE,如下所示:

 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;
 

这只影响已经创建的表.更有力的是,将来可以自动将默认角色分配给新对象:

 ALTER DEFAULT PRIVILEGES IN SCHEMA public
   GRANT SELECT ON TABLES TO xxx;
 

注意,默认情况下,这只会影响发出此命令的用户创建的对象(表):虽然它也可以设置发出用户是其成员的任何角色.但是,在创建新对象时,您不会为您的所有角色选择默认权限...所以仍然有一些faffing.如果您采用数据库具有拥有角色的方法,并将模式更改作为该角色执行,那么您应该将默认权限分配给拥有该角色. IMHO这一切都有点令人困惑,您可能需要尝试使用功能工作流程.

多个表/视图(9.0之前的PostgreSQL版本)

为了避免长时间的多表更改中的错误,建议使用以下“自动”进程向每个表/视图生成所需的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,用于copy-nasted爱情.自然,这只适用于已经创建的表.

  相同标签的其他问题

postgresql