我想在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;

但是,您似乎只能在数据库上授予创建、连接、临时和临时权限.

推荐答案

向单个表授予使用/ Select 权限

如果只授予连接到数据库的权限,则用户可以连接,但没有其他权限.您必须在名称空间(模式)上授予使用权,并分别在表和视图上进行 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;

这只影响已经创建的表.更强大的是,你可以在future 自动拥有default roles assigned to new objects个:

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

请注意,默认情况下,这只会影响发出此命令的用户创建的对象(表):尽管也可以对发出此命令的用户所属的任何角色进行设置.但是,在创建新对象时,您不会为您所属的所有角色 Select 默认权限...所以还是有人在装腔作势.如果采用数据库拥有所有者角色的方法,并且架构更改作为所有者角色执行,那么应该为该所有者角色分配默认权限.我想这一切都有点让人困惑,你可能需要进行实验来制定一个功能性的工作流程.

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

为避免长时间、多表更改中出现错误,建议使用以下"自动"过程 for each 表/视图生成所需的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命令,以便在公共场合对所有表、视图和序列授予SELECT,以进行复制粘贴.当然,这只适用于已经创建的表.

Postgresql相关问答推荐

Postgresql函数返回值别名

PostgreSQL散列连接与嵌套循环和散列索引

在Docker容器内的Postgres,如何通过Promail将JSON登录到Loki?

如何在生成的列的表达式中使用TIMESTAMP WITH时区列?

为什么 Postgres 中的 now() 和 now()::timestamp 对于 CET 和 CEST 时区如此错误?

Select 与输入数组完全相交的所有行?

对 VOLATILE 函数的调用会 destruct SELECT 语句的原子性

PL/pgSQL 中 PL/SQL %ISOPEN 的类似功能是什么?

PostgreSQL bytea 网络流量双倍预期值

postgresql 更新错误ERROR: invalid input syntax for type boolean:

带有初始数据的 docker postgres 不会在提交中持久化

从 PostgreSQL 中的字段中提取数字

H2 postgresql mode模式似乎不起作用

使用 PostGIS 查找给定点的 n 个最近邻?

错误:表tablename上的更新或删除违反外键约束

Postgresql - 更新规则 - 可能有一个最后修改日期,自动更新该行的on update?

使用 SQLAlchemy 进行 PostgreSQL ILIKE 查询

删除空行

由于不支持身份验证类型 10,无法连接到 Postgres DB

Rails 5 db 迁移:如何修复 ActiveRecord::ConcurrentMigrationError