加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在PostgreSQL中创建只读用户?

发布时间:2020-12-13 16:57:23 所属栏目:百科 来源:网络整理
导读:我想在PostgreSQL中创建一个只能从特定数据库执行SELECT的用户。在MySQL中,命令将是: GRANT SELECT ON mydb.* TO 'xxx'@'%' IDENTIFIED BY 'yyy'; 什么是PostgreSQL中的等效命令或一系列命令? 我试过了… postgres=# CREATE ROLE xxx LOGIN PASSWORD 'yyy
我想在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,TEMPORARY和TEMP。

授予使用/选择到单个表

如果您只向数据库授予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中,您可以使用单个命令向模式中的所有表/视图/ etc授予权限,而不必逐个键入它们:

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;

请注意,默认情况下,这将仅影响由发出此命令的用户创建的对象(表):虽然它也可以在发出用户是其成员的任何角色上设置。但是,在创建新对象时,您不会为您成为的所有角色选择默认权限…因此仍然有一些问题。如果采用数据库具有所有者角色的方法,并且模式更改作为所属角色执行,则应该为该所有者角色分配默认权限。 IMHO这有点混乱,你可能需要试验想出一个功能的工作流。

多个表/视图(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,用于复制粘贴爱。自然地,这将仅应用于已经创建的表。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读