我有一个包含四个模式的Amazon Redshift集群(Schema1,Schema2,Schema3和Schema 4)。
我在此群集中创建了一个用户User1
。我希望此用户只具有Schema1
中所有表的只读权限。目前,该用户可以访问(选择,插入,更新,删除)所有模式中的所有表。
我尝试了Redshift手册中的所有命令,但看起来没有任何效果。
示例:
REVOKE ALL on schema schema1 from User1
REVOKE ALL on schema schema2 from User1
REVOKE ALL on schema schema3 from User1
REVOKE ALL on schema schema4 from User1
我还尝试撤消个人权限(插入,更新,删除)。
我还尝试从单个表中撤消权限(插入,更新,删除)
尝试了手册中的所有组合。我正在使用SQL Workbench,所有语句都成功执行,没有任何语法错误。
无法理解。任何帮助表示赞赏。
P.S。我在角色和权限方面拥有15年的数据库经验。
答案 0 :(得分:0)
这些命令似乎有效:
CREATE SCHEMA schema1;
CREATE TABLE schema1.foo (name TEXT);
CREATE USER user1 PASSWORD 'Abcd1234';
GRANT USAGE ON SCHEMA schema1 TO user1;
GRANT SELECT ON ALL TABLES IN SCHEMA schema1 TO user1;
但是,它可能不会自动授予对将来创建的表的访问权限。
由于Amazon Redshift基于PostgreSQL 8.0.2,请参阅:How do you create a read-only user in PostgreSQL?
答案 1 :(得分:0)
就我而言,我遇到的问题是我有3个用户属于同一组。 该组已被授予对架构的所有表的所有特权。
由于组权限取代了 user 权限,因此吊销单个用户的权限无效。
TL; DR 在我的情况下,解决方案是为每个用户创建一个组,并撤消其他组对模式的访问。
REVOKE ALL ON SCHEMA my_schema FROM group my_group;
答案 2 :(得分:0)
这可能不是导致 OP 问题的原因,但它为我解决了问题,并且可以为遇到相同情况并最终在此线程上解决的人解决问题。
除了 George V 的回答之外,请注意 Redshift 中有一个 PUBLIC
组,它向每个用户授予权限。
PUBLIC 代表一个始终包含所有用户的组。单个用户的权限包括授予 PUBLIC 的权限、授予该用户所属的任何组的权限以及授予该用户个人的任何权限的总和。
(来自 GRANT 上的文档)
因此,例如,如果您想确保 User1 无权访问 schema2 中的表,您应该运行:
REVOKE ALL on schema schema2 from User1;
REVOKE ALL on schema schema2 from Group1; --assuming this is the only group of User1
REVOKE ALL on schema schema2 from PUBLIC;