Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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 Server触发器更新(col)为true还是false?_Sql_Sql Server_Tsql_Triggers - Fatal编程技术网

如果插入的值等于原始值,SQL Server触发器更新(col)为true还是false?

如果插入的值等于原始值,SQL Server触发器更新(col)为true还是false?,sql,sql-server,tsql,triggers,Sql,Sql Server,Tsql,Triggers,给出这个简单的触发器示例: CREATE TRIGGER example_update ON example_table FOR UPDATE AS BEGIN if update(someColumn) begin update example_table SET last_update_date = GETDATE() WHERE id IN (SELECT id FROM inserted); end END 如果someColumn的旧值和someColumn的

给出这个简单的触发器示例:

CREATE TRIGGER example_update
ON example_table
FOR UPDATE
AS BEGIN
   if update(someColumn) begin
      update example_table SET last_update_date = GETDATE() WHERE id IN (SELECT id FROM inserted);
   end
END
如果someColumn的旧值和someColumn的新值相等,更新(someColumn)是否返回true或false?例如,如果我运行以下两个SQL语句:

UPDATE example_table SET someColumn=1;
UPDATE example_table SET someColumn=1;
第二条语句是否触发触发器中的if块

此外,如果我执行以下假设,我的假设是否正确:

UPDATE example_table SET otherColumn=1;
然后,触发器中的update(someColumn)将返回false


如果这是一次重复,我很抱歉:函数名为update,这一事实使我的搜索结果充斥着update语句(这与update函数非常不同),并且使我很难确定这一行为。

update()函数不区分值是否已更改,只知道该列已更新。为此,应比较插入的
和删除的
伪表中的值。

函数不区分值是否已更改,只区分列是否已更新。要做到这一点,您应该比较插入的
伪表和删除的
伪表中的值。

您可能可以在键入此问题的时间内自己进行测试。是的,但我真的希望获得一些文档的权威链接,这将解决我可能没有预料到的任何其他有趣的位。根据:“…指示是否对表的指定列进行了插入或更新尝试…”-这意味着更新甚至不必成功(例如,在更新尚未发生的
而不是
触发器中,或在可能最终回滚的后触发器中),更不用说它必须成功地更改值,而不是将其更新为原来的值。我不认为会有权威的官方文档提供您想要的答案。但您可以测试它!这肯定是我希望找到的链接。更新与sql server 2000上的时间戳不起作用?更新返回即使触发语句失败也正确?这些都是我没有预料到的细节,可能会产生错误。感谢您的回答和链接!我认为这些限制是有意义的。请注意,
timestamp
不是指
datetime
列,而是指
rowversion
列,它们是maint由系统设置,并且根据定义,始终更新。在触发器内部,代码无法判断是否最终会发生更新-触发器中可能稍后会发生错误,用户可以在触发器运行时取消,而不是触发器可能会完全忽略该列。同样,函数的目的是是指试图修改某个列。您可能可以在键入此问题所需的时间内自行测试。是的,但我真的希望获得一些文档的权威链接,这些链接将解决我可能没有预料到的任何其他有趣内容。根据:“…指示是否在表的指定列上进行了插入或更新尝试…”-这意味着更新甚至不必成功(例如,在更新尚未发生的
而不是
触发器中,或在可能最终回滚的后触发器中),更不用说它必须成功地更改值,而不是将其更新为原来的值。我不认为会有权威的官方文档提供您想要的答案。但您可以测试它!这肯定是我希望找到的链接。更新与sql server 2000上的时间戳不起作用?更新返回即使触发语句失败也正确?这些都是我没有预料到的细节,可能会产生错误。感谢您的回答和链接!我认为这些限制是有意义的。请注意,
timestamp
不是指
datetime
列,而是指
rowversion
列,它们是maint由系统设置,并且根据定义,始终更新。在触发器内部,代码无法判断是否最终会发生更新-触发器中可能稍后会发生错误,用户可以在触发器运行时取消,而不是触发器可能会完全忽略该列。同样,函数的目的是是指显示试图修改某列。您是对的,
UPDATE()
函数不这样做,但您可以做另一件事来避免。请查看我的答案。您是对的,
UPDATE()
函数不这样做,但您可以做另一件事来避免。请查看我的答案。