检查删除是不是删除所有表值的触发器

Posted

技术标签:

【中文标题】检查删除是不是删除所有表值的触发器【英文标题】:TRIGGER that checks if that delete removes all the table values检查删除是否删除所有表值的触发器 【发布时间】:2019-12-11 14:09:51 【问题描述】:

基本上我只是不想让DELETE FROM X 删除所有行。

例如:

DELETE FROM X WHERE ID = 3 OR ID = 4; --> 允许,因为不要尝试删除所有表。

DELETE FROM X; --> 不允许,因为它会删除所有表。

如何使用触发器做到这一点?

【问题讨论】:

如果只有两行:3 和 4 怎么办? 那么不,至少需要 1 行才能工作,但我认为如果控制它的 DELETE FROM X 是否足够 您不能使用触发器执行此操作,因为触发器在一个事务中执行。您看不到是否有可能由另一个客户端同时运行的另一个事务正在删除最后一行。也就是说,您的事务或其他事务都不会删除 所有 行,但是一旦你们俩都提交了,就不会剩下任何行了。 我可以尝试在触发器中执行查询吗? 上述 cmets 中描述的 Aß 很难避免这种情况。更改列上所需的条件可能更容易。为什么这是必要的? 【参考方案1】:

如果没有where 子句,您实际上可能不需要触发器来阻止delete

你可以通过设置做你想做的事:

SET SQL_SAFE_UPDATES = 1;

这方面的文档是here。

注意:这当然适用于所有表格。如果您只想对一个表进行此限制,那么触发器可能是合适的。

【讨论】:

是的,我只想在一张桌子上,你能帮帮我吗?

以上是关于检查删除是不是删除所有表值的触发器的主要内容,如果未能解决你的问题,请参考以下文章

如何检查触发器是不是无效?

JavaScript:检查对象数组中是不是存在重复的键值并删除所有但最近添加的具有该键值的对象

如何检查在mysql中存储多个值的变量中是不是存在特定值?

删除表时是不是可以自动删除触发器和序列

在删除触发postgreSQL之前检查列值

SQLServer之删除触发器