【问题标题】:Is it possible to disable delete all query in Postgres?是否可以在 Postgres 中禁用删除所有查询?
【发布时间】:2016-03-20 03:14:27
【问题描述】:

是否可以只允许那些有WHERE 子句的DELETE 查询?

我已经尝试使用RULE,但我不知道在WHERE 子句中添加什么,现在这个RULE 禁用所有DELETE 查询:

create rule prevent_delete_all  as on DELETE to site 
DO INSTEAD NOTHING

编辑

撤销用户的删除访问权限并创建用于调用DELETE 的存储过程的问题是我不想重写使用数据库的应用程序代码

【问题讨论】:

  • 考虑:撤销大多数帐户对表的删除访问权限,并且只允许使用 where 子句所需参数的存储过程?仅检查 where 子句的问题是 where 1=1 仍然会删除所有
  • 如果我错了,请纠正我,但我相信Rule 的条件仅适用于实际数据,而不适用于一般意义上的x 子句,例如WHERE 子句存在.我认为这不是您的解决方案的正确格式。但话虽如此,我很想看看其他人的解决方案(似乎是一个方便的诀窍)
  • 大声笑,不要删除这篇文章,我会从我的anti-pattern收藏中链接它。
  • @VsevolodGoloviznin 也不要忘记你的老朋友“截断”,根据你的应用程序,你可能需要以某种方式防止滥用/误用它!
  • @xQbert,让 delete 完成它的工作可能更有效,不要提交;检查删除后是否有exists 至少一行,如果没有 - 回滚。 exists 通常比 count 更有效率。

标签: sql postgresql


【解决方案1】:

正如 cmets 中所讨论的,在所有删除语句中都需要 WHERE 子句并没有多大帮助。问题是用户总是可以声明一个始终为真的 WHERE 子句——例如:

Delete from students where 1=1;

我之前尝试过检测这样的子句 - 它们可能非常复杂,因此持续检测它们非常困难,如果不是不可能的话。

相反,我建议您重新考虑您正在尝试做什么。一些替代方案可能是:通过对数据进行版本控制来记录对表的所有更改,或者禁止删除任何行,而只需修改应用程序以通过添加“已删除”列将行标记为已删除。

【讨论】:

  • 问题背后的主要思想是防止意外删除数据(当您“忘记”添加 WHERE 子句以删除操作并按执行时),而故意删除数据并非如此。无论如何感谢您的回答:)
猜你喜欢
  • 2016-09-21
  • 2015-03-31
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多