Sql 是否可以在Postgres中禁用删除所有查询?
是否可以只允许那些Sql 是否可以在Postgres中禁用删除所有查询?,sql,postgresql,Sql,Postgresql,是否可以只允许那些DELETE查询中包含WHERE子句 我曾尝试使用规则,但我不知道在它的WHERE子句中放入什么,现在该规则禁用所有删除查询: create rule prevent_delete_all as on DELETE to site DO INSTEAD NOTHING 编辑 取消用户的delete访问并创建调用delete的存储过程的问题在于,我不想重新编写使用DB的应用程序代码,正如在注释中所讨论的那样,在所有delete语句中要求使用WHERE子句不会有多大帮助。问题
DELETE
查询中包含WHERE
子句
我曾尝试使用规则
,但我不知道在它的WHERE
子句中放入什么,现在该规则
禁用所有删除
查询:
create rule prevent_delete_all as on DELETE to site
DO INSTEAD NOTHING
编辑
取消用户的delete访问并创建调用
delete
的存储过程的问题在于,我不想重新编写使用DB的应用程序代码,正如在注释中所讨论的那样,在所有delete语句中要求使用WHERE子句不会有多大帮助。问题在于,用户总是可以声明一个始终为true的WHERE子句,例如:
Delete from students where 1=1;
我以前试过检测这样的子句——它们可能任意复杂,所以一致地检测它们是非常困难的,如果不是不可能的话
相反,我建议你重新考虑你想做什么。一些替代方法可能是:通过对数据进行版本控制来记录对表的所有更改,或者不允许删除任何行,只需修改应用程序,通过添加“已删除”列将行标记为已删除。考虑:取消大多数帐户对表的删除访问,并且只允许存储过程具有where子句所需的参数?仅仅检查where子句的问题是
where 1=1
仍然会删除所有错误,如果我错了,请纠正我,但我相信规则的条件只适用于实际数据,而不是一般意义上的ifx
子句,例如存在where
子句。我认为这不是适合您的解决方案的正确格式。但是说了这些,我很想从其他人那里看到一个解决方案(似乎是一个方便的诀窍)哈哈,不要删除这篇文章,我将从我的收藏中链接它。@VsevolodGoloviznin也不要忘记你的老朋友“truncate”,这取决于你的应用程序,你可能需要以某种方式防止滥用/误用它@xQbert,让delete完成它的工作可能更有效,不要提交;检查删除后是否至少存在一行,
,如果不存在-回滚exists
通常比code>count
更有效。问题背后的主要思想是防止意外删除数据(当您“忘记”添加WHERE子句以删除操作并按execute时),而故意删除数据则不是这样。无论如何,谢谢你的回答:)