Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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
MySQL触发器是否可能以静默方式失败?_Mysql_Sql_Triggers_Mysql 8.0 - Fatal编程技术网

MySQL触发器是否可能以静默方式失败?

MySQL触发器是否可能以静默方式失败?,mysql,sql,triggers,mysql-8.0,Mysql,Sql,Triggers,Mysql 8.0,我正在努力调试一些东西 我们有大量的原始表格,其中电子商务数据以较高的速度添加到表格中。 我们有通过insert、update和delete触发器填充的汇总表,当用户从我们的UI进行查询时使用这些触发器 因此,这两个表应该“匹配”,也就是说,如果原始表的总和(收入)是1234567美元,那么汇总表的总和(收入)应该是相同的 这是有效的,而且已经有效很长时间了,但我们发现了一些看似完全不相关的实例,其中突然出现了表不匹配的情况。在原始表中,我们将有汇总表中未考虑的数据。这个问题是不可复制的——如果

我正在努力调试一些东西

我们有大量的原始表格,其中电子商务数据以较高的速度添加到表格中。 我们有通过insert、update和delete触发器填充的汇总表,当用户从我们的UI进行查询时使用这些触发器

因此,这两个表应该“匹配”,也就是说,如果原始表的总和(收入)是1234567美元,那么汇总表的总和(收入)应该是相同的

这是有效的,而且已经有效很长时间了,但我们发现了一些看似完全不相关的实例,其中突然出现了表不匹配的情况。在原始表中,我们将有汇总表中未考虑的数据。这个问题是不可复制的——如果我们删除原始数据和摘要数据并再次添加,那么所有内容都会很好地填充。这个问题似乎也会影响同一数据集中的任意数据块。例如,周一到周三,一切都很好,周四完全是一团糟,周五以后一切又都很好

我几乎可以肯定,没有按预期工作的触发器是插入后触发器。我们维护所有数据的创建和更新时间,有问题的行没有更新

我还知道(或认为我知道)如果触发器失败,整个插入将失败并回滚

分享触发因素和细节会很快变得复杂。我只是想看看是否有人能帮助激发一个头脑风暴的过程。我想知道的是:

  • 有人遇到过类似的情况吗
  • 是否存在一种可能的情况,我不知道哪一行可以插入到表中,触发器可能会失败,但该行仍然在表中
  • 是否存在与触发器相关的常见错误
我完全不知道如何调试

有人遇到过类似的情况吗


是的,我从不依赖仅触发器的解决方案来保持摘要表的同步。尽管它在理论上应该有效,但它很少能长期有效。基于触发器的系统非常复杂,以至于我不经常使用它们

是否存在一种可能的情况,我不知道哪一行可以插入到表中,触发器可能会失败,但该行仍然在表中

有一些故意“处理”SQLException的方法,可能会导致触发器在应该失败的地方继续。我从来没有这样做过,所以我没有一个例子

如果您在
catch()
块中编写代码来“吃掉异常”,但不做任何事情来修复或报告该条件,则可以用Java进行类比

很明显,如果你做了,你会知道的,因为你必须努力去做

除此之外,我不知道有哪种情况下触发器会失败,但生成触发器的SQL操作会成功

是否存在与触发器相关的常见错误

我想到的一个问题是,如果触发器主体中有复杂的条件逻辑,并且该逻辑没有涵盖某些情况。所以它没有做你期望它做的工作

另一个常见错误是触发器工作正常,但随后一些客户端直接更新了汇总表,并将汇总表中的值弄乱了


或者竞争条件导致汇总表由不同的客户端同时更新,用不完整的计算覆盖彼此的工作。

@GordonLinoff我刚刚测试过,以确保--如果使用加载数据填充,它仍会为加载的每一行运行插入触发器。@BillKarwin。哎呀。我把MySQL和SQL Server弄糊涂了。SQL Server中的等效项不会自动触发触发器。我删除了评论。@GordonLinoff-我们做批量插入,但我也在那里手动测试过,我很确定这应该是好的。装配工的语法以“组织更新后_xyz.raw_每行销售开始…”@yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy。嗯。我认为更新后触发器发生在成功插入行之后。这意味着,如果查询有任何错误,行仍然存在,但触发器逻辑可能无法实现。不,如果AFTER触发器失败,它将取消整个kit和kaboodle,包括生成触发器的原始操作。还有由同一原始操作生成的其他BEFORE或AFTER触发器执行的任何内容,或者由这些触发器中的语句导致运行的其他表的触发器执行的任何内容。所有的事情都被取消了。“尽管理论上它应该有效,但它很少能长期有效。”可悲的是,我通过艰难的方式学会了这一点。欣赏这些想法。比赛条件是一个非常有趣的想法,我没有考虑过。是时候深入研究了:D经典的福尔摩斯名言经常适用:“当你消除了不可能,剩下的无论多么不可能,都必须是真相。”哦,天哪,你把它钉住了。我们将两种非常相似但不同的数据类型写入不同计划中的相同表中。我已经验证了一种模式,即当一种数据类型汇总时,另一种数据类型丢失。所以在两个计划同时插入的“不可能”情况下。。。其中一个消失了。哇!