Sql 如何防止单独表上的两个触发器同时触发?

Sql 如何防止单独表上的两个触发器同时触发?,sql,sql-server,database-trigger,Sql,Sql Server,Database Trigger,我有一个名为ClientInfo的表存储客户的个人信息,另一个名为EmergencyContactInfo的表存储客户的紧急联系信息。现在,我在ClientInfo表上有一个更新触发器,如果他们的任何个人信息发生更改,它会将一条记录插入到第三个名为ClientLog的表中。如果客户的紧急联系信息发生变化,我还想创建一个ClientLog记录 问题是,用户只需从我的网页中进行一次保存,即可更改客户的个人信息和紧急联系信息。如果我在EmergencyContact表上放置了一个更新触发器,那么当我只

我有一个名为ClientInfo的表存储客户的个人信息,另一个名为EmergencyContactInfo的表存储客户的紧急联系信息。现在,我在ClientInfo表上有一个更新触发器,如果他们的任何个人信息发生更改,它会将一条记录插入到第三个名为ClientLog的表中。如果客户的紧急联系信息发生变化,我还想创建一个ClientLog记录


问题是,用户只需从我的网页中进行一次保存,即可更改客户的个人信息和紧急联系信息。如果我在EmergencyContact表上放置了一个更新触发器,那么当我只需要一条记录时,我的两个触发器都将触发,ClientLog表将插入两条新记录


据我所知,不存在跨多个表的更新触发器。当客户的个人信息和紧急联系人信息都发生变化时,我可以采取什么替代方法插入一条记录?

您的理解是正确的,触发器不能跨越多个表

也没有防止触发器触发的事情

你能做的就是在触发器中加入逻辑,如果某些条件是真的,它会阻止它做任何事情

现在我不知道您正在向日志表中写入什么,以及您想要强制执行什么逻辑,但是一个例子是,当触发器触发时,如果在过去的x小时内同一个客户机已经有一个日志条目(日志表中的行),那么就不要在日志表中插入新行

您甚至可以使用到日志表的
外部联接
WHERE NOT EXISTS()
子句来处理多行插入/更新


但基本上我要说的是,让两个触发器都触发,在两个触发器中,在写入日志表之前检查某些条件是否为真/假。否则,什么也不要做。

您正在使这变得不必要的困难和容易出错

如果每个数据表都有一个单独的日志表和它自己的触发器,那么您可以忽略整个问题,让它们按照预期的方式工作


如果要同时查看日志信息,可以在显示数据时对两个表使用联接。

Cold是否将审核移动到执行更新的过程,而不是使用触发器?“如果我在EmergencyContact表上放置了一个更新触发器,那么当我只需要一条记录时,我的两个触发器都将触发,ClientLog表将插入两条新记录。“你为什么要这样?我觉得写两张唱片是完全合理的。您正在将什么写入ClientLog?使用上下文信息的可能选项。我想说,如果你不能将审计逻辑放在代码中,那么让查看审计数据的东西理解这两条记录来自一个事件。某种类型的关联id-但这同样来自代码。偶尔抑制1个触发器会导致更多问题。@SeanRange不幸的是,这不是因为还有其他几个自动进程可以更改客户端信息,而且维护起来会非常混乱。那么“禁用触发器”呢?我也不理解这里真正的问题,但这不是一个不真实的说法吗?我不认为OP在说“防止触发器触发”时所想的是“禁用触发器”。第一个是普遍性的,第二个,正如我读到的,是有条件的。当我读到这个问题时,我意识到它并不是OP问题的真正解决方案。我明白你的意思,虽然我不确定每个人都会这么看。可以肯定的是,这个问题的措辞可以更清楚一点。@TabAlleman抱歉,我不擅长措辞。哪一部分会引起混乱,我将编辑我的问题,以使其更好。虽然我同意让这些触发器自由运行,然后使用联接(可能在视图中),但您并没有解决联接条件可能是什么这一非平凡的技术难题。我假设表将具有适当的pk/fk。如果没有,它们就需要被修复。我想说的是,要想知道日志表中的哪些行应该被“连接”以表示一次更新,以避免错误的重复,这可能超出了这个范围。这些记录是客户端和客户端联系人。只需要在clientid上加入,然后按时间戳排序,我在这里没有看到任何过于复杂的东西。如果OP想做一些额外的工作,他可以向两个日志表添加一个UpdateID,因为它们都来自一个表单提交。