PostgreSQL,限制特定列的更新(只读)

25

如果更新包括对特定列的更改,是否可能让PostgreSQL限制/阻止对特定记录的更新?

如何实现这一点? 触发器/约束? 实现这一点最有效的方法是什么?

我正在使用版本9.1

3个回答

32

最简单的方法是创建一个BEFORE UPDATE触发器,该触发器将比较OLDNEW行,并且如果行的更改被禁止,则RAISE EXCEPTION


1
来自另一个SO问题的此类触发器示例 - tanius

7
不,但编写这个应该很容易。 只需设置一个BEFORE UPDATE触发器,比较旧字段与新字段,并在它们不同的情况下引发错误。 pgSQL文档中有一些编写触发器函数的示例。

1
有几种解决方案可供选择:
  • 你可以使用一个BEFORE UPDATE触发器,就像其他答案中已经提到的那样。另一个Stack Overflow答案展示了一个这样一个触发器的例子

  • 你可以将表拆分为两个表,它们之间有一个1:1的关系。然后,你可以为一个表提供SELECTUPDATE权限,而只为另一个表提供SELECT权限。

  • 你可以只为表的一部分列提供UPDATE权限:GRANT UPDATE(col1, col2)详细信息)。

  • 你可以为表提供只读访问,并创建一个包含可更新列的VIEW,并授予对其的UPDATE权限。

  • 你可以使用SECURITY DEFINER将表隐藏在一个FUNCTION后面。表本身不提供UPDATE权限,而是用户只能通过函数来更新表。

这个列表的启发。还可以在我的另一个回答中更详细地了解这些解决方案,以Supabase系统为背景。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接