以下是更新的触发器将UPDATE_TS设置为CURRENT_TIMESTAMP。 触发器成功运行,但我想知道它是如何工作的。我的理解是插入的表包含插入的所有记录。
我的问题: 1)我不明白我在这里使用的内连接如何知道选择要插入的项目? 在执行此触发器时,插入的表中包含哪些项目,
2)如何在执行时看到插入表的内容?
3)我在插入的表上使用?
进行内部连接的是什么表CREATE TRIGGER my_table_update_ts_trigger
ON [mydatabase].dbo.[MY_TABLE]
INSTEAD OF UPDATE
AS
UPDATE t SET
ANOTHER_TABLE_ID = i.ANOTHER_TABLE_ID,
FREE_TEXT= i.FREE_TEXT,
UPDATE_TS = CURRENT_TIMESTAMP,
CREATE_USER = i.CREATE_USER,
UPDATE_USER = i.UPDATE_USER
FROM [dbo].MY_TABLE AS t
INNER JOIN inserted AS i
ON t.MY_TABLE_ID = i.MY_TABLE_ID
答案 0 :(得分:1)
逻辑很简单:
Sql Server使用语句“触及”的行填充tempdb中的已插入和已删除临时表。这些表与原始表具有相同的结构。
当您使用插入或删除表加入表时,应该在pk字段上进行连接(在示例中为MY_TABLE_ID),但如果必须更新另一个表,则可以使用任何其他列。
要记住的重要一点是,插入和删除伪表中有几条记录:语句修改(插入,删除或更新)的所有记录。 例如,如果你做一个简单的(仅仅是为了解释的愚蠢的例子):
UPDATE MyTable SET MyField = MyField
没有任何 WHERE 子句,您正在更新表中的所有记录,整个表将被复制到插入和删除的表中,并可供触发器访问。
请参阅here
插入和删除的是由Sql管理的虚拟表,您无权访问它们。
另请注意,由于您使用的是 INSTEAD OF 触发器,因此Sql不会更新任何行,而是执行初始UPDATE语句,Sql将运行触发器的代码,因此您必须在触发器中执行UPDATE,您可以更新不同的表而不是原始表。
如果您使用AFTER触发器,Sql会完成初始更新,然后调用您的触发器代码