2010-11-28 70 views
1

在SQL Server 2008中,我有一个场景,其中插入/更新时有一个包含复杂验证的表。这包括需要临时将XML输入转换为表格,以便根据永久表格验证其数据。SQL Server中“AFTER INSERT,UPDATE”触发器的行为

但是,我也有我经常更新不需要验证的简单整数列的场景。根据我读到的here,当我执行更新时,似乎SQL Server将返回临时内存中“插入”表中的整个行,而不仅仅是受影响的列。如果是这样,那么它就意味着每执行一次简单的整数更新,复杂的XML验证就会毫无用处地完成。

我是否正确理解这一点,如果是的话,我该如何解决这个需要通过存储过程插入/更新的问题?

回答

3

是的,首先,触发器将触发每一个插入或更新操作 - 您不能限制只在特定列受到影响时触发。您可以检查触发器内部,看看某些列是否受到影响,并基于此决定 - 但您无法阻止触发器首先触发。

第二,是的,当触发器触发时,您将在INSERTED和/或DELETED伪表中拥有底层表的所有列。

您可能想要更改此方法的一种方法是将大型XML列移动到单独的表中,并将该大型XML验证触发器仅放在该表上。在这种情况下,如果只更新或插入到基表中,您将获得更少的数据,更少的验证逻辑。只有当你插入或更新到XML表格时,你才会得到整个验证。

+2

我刚刚意识到为什么我从来没有使用触发器和总是使用存储过程插入/更新/删除。说“如果@xml不为空begin(validate)(update)end”更容易。 – IamIC 2010-11-28 07:50:40

相关问题