sql - 无法授予对现有表的访问权限

标签 sql postgresql roles rbac

我未能添加新的数据库角色,该角色对特定数据库的表具有 SELECT 权限。

我的问题是该角色无法从现有数据库中的表中SELECT

这是我失败的测试用例(编写它可以安全地复制粘贴到 /tmp/test.sh 并执行):

# --- cleanup objects, if any
psql -U postgres -c "REVOKE SELECT ON ALL SEQUENCES IN SCHEMA public FROM db_reader"
psql -U postgres -c "REVOKE SELECT ON ALL TABLES IN SCHEMA public FROM db_reader"
psql -U postgres -c "REVOKE USAGE ON SCHEMA public FROM db_reader"
psql -U postgres -c "DROP ROLE IF EXISTS db_reader"
psql -U postgres -c "DROP DATABASE IF EXISTS some_existing_db"
# --- test
psql -U postgres -c "CREATE DATABASE some_existing_db"
psql -U postgres some_existing_db -c "CREATE TABLE cats (name varchar(10))"
psql -U postgres some_existing_db -c "INSERT INTO cats (name) VALUES ('a'), ('b')"
psql -U postgres -c "CREATE ROLE db_reader WITH login"
psql -U postgres -c 'GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO db_reader'
psql -U postgres -c 'GRANT SELECT ON ALL TABLES IN SCHEMA public TO db_reader'
psql -U postgres -c 'GRANT USAGE ON SCHEMA public TO db_reader'
psql -U db_reader some_existing_db -c "SELECT COUNT(1) FROM cats"

看起来我在这里遗漏了一些极其明显、令人尴尬的东西,因为上面的操作失败并出现以下错误:

ERROR:  permission denied for relation cats

为什么?

最佳答案

您没有注意到数据库在逻辑上是分开的。

您的GRANT 语句在数据库postgres 中执行(如果您没有指定数据库名称,psql 将尝试连接到数据库与数据库用户同名)。

因此,这些授权的效果仅限于您所连接的数据库。

您必须将 some_existing_db 添加到您授予 db_reader 权限的 psql 调用中。

关于sql - 无法授予对现有表的访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50677805/

相关文章:

Ansible - with_dict : dictionary - How to use variables defined in each dictionary which depends upon others

sql - 获取每个条目的最新记录

sql - 为什么要使用相关子查询?

postgresql - JPA - Postgres - 如何使用 Distinct 和 Group By 从表中获取结果

web-services - 如何从具有限制和偏移量的不同表中获取和排序行?

具有复杂的用户角色权限结构的 Python App Engine 项目

roles - 根据用户角色将自定义字段设置为只读

mysql - SQL查询从两个日期列中获取工作日

mysql - SQL 一种从较大类别中选择项目的简单方法

python - TimeoutError : QueuePool limit of size 5 overflow 10 reached, 连接超时,超时30