想知道如何在插入的Table Works上使用内部联接而不是UPDATE触发器

时间:2013-12-03 17:49:53

标签: sql sql-server sql-server-2008

以下是更新的触发器将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

1 个答案:

答案 0 :(得分:1)

逻辑很简单:

Sql Server使用语句“触及”的行填充tempdb中的已插入和已删除临时表。这些表与原始表具有相同的结构。

  • 在触发器FOR INSERT 中,您拥有已插入表格中的所有新记录
  • 在触发器FOR DELETE 中,您已删除已删除中的所有记录 表
  • 在触发器FOR UPDATE 中,您同时拥有:已删除中的旧记录 (旧值),插入(新值)中的新记录。

当您使用插入或删除表加入表时,应该在pk字段上进行连接(在示例中为MY_TABLE_ID),但如果必须更新另一个表,则可以使用任何其他列。

要记住的重要一点是,插入和删除伪表中有几条记录:语句修改(插入,删除或更新)的所有记录。 例如,如果你做一个简单的(仅仅是为了解释的愚蠢的例子):

UPDATE MyTable SET MyField = MyField

没有任何 WHERE 子句,您正在更新表中的所有记录,整个表将被复制到插入和删除的表中,并可供触发器访问。

请参阅here

插入和删除的是由Sql管理的虚拟表,您无权访问它们。

另请注意,由于您使用的是 INSTEAD OF 触发器,因此Sql不会更新任何行,而是执行初始UPDATE语句,Sql将运行触发器的代码,因此您必须在触发器中执行UPDATE,您可以更新不同的表而不是原始表。

如果您使用AFTER触发器,Sql会完成初始更新,然后调用您的触发器代码