我无法添加新的DB角色,该角色对特定数据库中的表具有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调用中,在这里您将特权授予psql

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

10-11 08:39