更新触发器后的SQL Server

use*_*897 17 sql t-sql sql-server sql-server-express sql-server-2014

这个触发器有问题.我希望它只将所请求的信息更新到有问题的行(我刚刚更新的那个)而不是整个表.

CREATE TRIGGER [dbo].[after_update] 
    ON [dbo].[MYTABLE]
    AFTER UPDATE
    AS 
    BEGIN
          UPDATE MYTABLE 
          SET mytable.CHANGED_ON = GETDATE(),
          CHANGED_BY=USER_NAME(USER_ID())
Run Code Online (Sandbox Code Playgroud)

如何告诉触发器这仅适用于相关行?

Jua*_*uan 17

这是测试后的例子

CREATE TRIGGER [dbo].UpdateTasadoresName 
ON [dbo].Tasadores  
FOR  UPDATE
AS 
      UPDATE Tasadores 
      SET NombreCompleto = RTRIM( Tasadores.Nombre + ' ' + isnull(Tasadores.ApellidoPaterno,'') + ' ' + isnull(Tasadores.ApellidoMaterno,'')    )  
      FROM Tasadores 
    INNER JOIN INSERTED i ON Tasadores.id = i.id
Run Code Online (Sandbox Code Playgroud)

插入的特殊表将包含更新记录中的信息.


小智 6

试试这个(更新,而不是更新后)

CREATE TRIGGER [dbo].[xxx_update] ON [dbo].[MYTABLE]
    FOR UPDATE
    AS
    BEGIN

        UPDATE MYTABLE
        SET mytable.CHANGED_ON = GETDATE()
            ,CHANGED_BY = USER_NAME(USER_ID())
        FROM inserted
        WHERE MYTABLE.ID = inserted.ID

    END
Run Code Online (Sandbox Code Playgroud)

  • 触发触发器时尚未提交更新,@kuklei。触发器可以停止提交更新。 (4认同)

Rez*_*abi 6

你可以调用INSERTED,SQL Server使用这些表来捕获事件发生之前和之后修改行的数据。我假设在你的表中键的名称是Id

我认为下面的代码可以帮助你

CREATE TRIGGER [dbo].[after_update]
ON [dbo].[MYTABLE]
   AFTER UPDATE
AS
BEGIN
    UPDATE dbo.[MYTABLE]
    SET    dbo.[MYTABLE].CHANGED_ON = GETDATE(),
           dbo.[MYTABLE].CHANGED_BY = USER_NAME(USER_ID())
    FROM   INSERTED
    WHERE  INSERTED.Id = dbo.[MYTABLE].[Id]
END
Run Code Online (Sandbox Code Playgroud)


Kan*_*ane 2

您应该能够访问该INSERTED表并检索 ID 或表的主键。与这个例子类似的东西......

CREATE TRIGGER [dbo].[after_update] ON [dbo].[MYTABLE]
AFTER UPDATE AS 
BEGIN
    DECLARE @id AS INT
    SELECT @id = [IdColumnName]
    FROM INSERTED

    UPDATE MYTABLE 
    SET mytable.CHANGED_ON = GETDATE(),
    CHANGED_BY=USER_NAME(USER_ID())
    WHERE [IdColumnName] = @id
Run Code Online (Sandbox Code Playgroud)

INSERTED以下是 MSDN 上关于使用触发器时可用的和表的链接DELETEDhttp://msdn.microsoft.com/en-au/library/ms191300.aspx

  • 使用触发器时,您应该始终假设有多行受到影响。 (7认同)
  • Kane,如果更新多行,这是不正确的,因为标量值只会为集合中的最后一行设置,而会错过所有其他行。 (4认同)