由于隐私问题,我想给予一组用户仅对应用程序的特定列进行选择性访问。因此,当用户在受限表上键入“SELECT选项”时,他只能看到允许的列。
我想做的事:
1.对特定用户组隐藏表的特定列
1.“SELECT *”照常工作,但隐藏列,这是不允许的
1.不应禁止对基础表执行JavaScript,即使它会暂时破坏视图(稍后修复它也没关系)
比如说:
- 组名为“restricted_group”
- 表为“users”(id,description,password)
目标是:当来自“restricted_group”的用户执行SELECT * FROM用户时,他必须只看到“id”,“description”字段。
我试了两种方法:
1.将视图用于基础表:
CREATE VIEW restricted_view AS
SELECT "id", "description" FROM users;
GRANT SELECT ON restricted_view to restricted_group;
字符串
它完成了这项工作,但它防止了表“users”上的任何错误,因为Postgres的限制“不能改变表,因为其他对象依赖于它”。对我来说,Postgres中的行为非常奇怪,因为在Oracle中,它只能使视图无效,但不能防止错误。使用CASCADE或重新创建VIEW作为此任务的一部分是不可行的。
1.使用列的显式GRANT访问:
GRANT SELECT ("ID", "desc") ON users TO restricted_group;
型
它禁止用户进行“SELECT * users”,并要求显式列出所有允许的列,这对用户来说并不友好。因为用户应该首先检查任何列以进行访问,而不是快速获取数据。
请告诉我一个解决方案,这将满足所有的初步要求?
2条答案
按热度按时间kfgdxczn1#
Postgres并不完全限制对视图的表的修改,只是那些会破坏视图的表。只要你不改变其他东西所依赖的表列,你就可以通过任何方式添加/更改/删除表列。不仅仅是视图,还有外键引用,任何
pg_depend
或pg_constraint
条目。如果你想要一个可断开的视图,或者只是将它与底层表解耦,使用一个普通的SQL表或集返回函数,或者在视图和源表之间放置一个:
字符串
| ID|描述|priv|
| --|--|--|
| 1 |描述|priv|
正如您所观察到的,一个常规的、直接的视图将通过依赖关系与表绑定,从而阻止一些更改:
的数据
一个中间函数消除了这种依赖性:
型
| ID|描述|
| --|--|
| 1 |描述|
型
| ID|描述|
| --|--|
| 1 |94c7bb56-8ab1-4b2a-85a6-3ebb302acd50|
只要在表中找到的类型可以被强制为函数应该返回的类型,这将继续工作。
fiddle的
o75abkj42#
没有。
你坚持了以下要求:
1.如果使用视图,它必须始终可用且有效。
1.您打算对基础表进行更改,这将使视图无效。
1.当基础表发生更改时,您不准备重新创建视图。
1.您希望查询能够为所有列指定“*”,但实际上并不返回所有列。
这组要求根本不相容。
显而易见的解决方案是在需要时重新创建视图,但您没有说明为什么这不是您的选择。