Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否可以在Postgres中禁用删除所有查询?_Sql_Postgresql - Fatal编程技术网

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
仍然会删除所有错误,如果我错了,请纠正我,但我相信
规则的条件只适用于实际数据,而不是一般意义上的if
x
子句,例如存在
where
子句。我认为这不是适合您的解决方案的正确格式。但是说了这些,我很想从其他人那里看到一个解决方案(似乎是一个方便的诀窍)哈哈,不要删除这篇文章,我将从我的收藏中链接它。@VsevolodGoloviznin也不要忘记你的老朋友“truncate”,这取决于你的应用程序,你可能需要以某种方式防止滥用/误用它@xQbert,让delete完成它的工作可能更有效,不要提交;检查删除后是否至少存在一行
,如果不存在-回滚
exists
通常比code>count
更有效。问题背后的主要思想是防止意外删除数据(当您“忘记”添加WHERE子句以删除操作并按execute时),而故意删除数据则不是这样。无论如何,谢谢你的回答:)