SQL Server:触发如何读取Insert,Update,Delete的值

Tom*_*mas 17 sql sql-server triggers

我在一个表中有触发器,并希望UserId在插入,更新或删除行时读取值.怎么做?下面的代码不起作用,我得到错误UPDATED

ALTER TRIGGER [dbo].[UpdateUserCreditsLeft] 
   ON  [dbo].[Order]
   AFTER INSERT,UPDATE,DELETE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE 
    @UserId INT,

    SELECT @UserId = INSERTED.UserId FROM INSERTED, DELETED

    UPDATE dbo.[User] SET CreditsLeft = CreditsLeft - 1 WHERE Id = @UserId
END
Run Code Online (Sandbox Code Playgroud)

Mat*_*lie 29

请注意,这inserted, deleted意味着inserted CROSS JOIN deleted和每一行的每个组合相同.我怀疑这是你想要的.

这样的事情可能会帮助你开始......

SELECT
  CASE WHEN inserted.primaryKey IS NULL THEN 'This is a delete'
       WHEN  deleted.primaryKey IS NULL THEN 'This is an insert'
                                        ELSE 'This is an update'
  END  as Action,
  *
FROM
  inserted
FULL OUTER JOIN
  deleted
    ON inserted.primaryKey = deleted.primaryKey
Run Code Online (Sandbox Code Playgroud)


根据你想做什么,你再引用表,你有兴趣与inserted.userIDdeleted.userID


最后,请注意inserted并且deleted表,并且可以(并且可以)包含多个记录.

如果一次插入10条记录,该inserted表将包含所有10条记录.这同样适用于删除和deleted表格.并且在更新的情况下两个表.


编辑示例在OP编辑后触发.

ALTER TRIGGER [dbo].[UpdateUserCreditsLeft] 
  ON  [dbo].[Order]
  AFTER INSERT,UPDATE,DELETE
AS 
BEGIN

  -- SET NOCOUNT ON added to prevent extra result sets from
  -- interfering with SELECT statements.
  SET NOCOUNT ON;

  UPDATE
    User
  SET
    CreditsLeft = CASE WHEN inserted.UserID IS NULL THEN <new value for a  DELETE>
                       WHEN  deleted.UserID IS NULL THEN <new value for an INSERT>
                                                    ELSE <new value for an UPDATE>
                  END
  FROM
    User
  INNER JOIN
    (
      inserted
    FULL OUTER JOIN
      deleted
        ON inserted.UserID = deleted.UserID  -- This assumes UserID is the PK on UpdateUserCreditsLeft
    )
      ON User.UserID = COALESCE(inserted.UserID, deleted.UserID)

END
Run Code Online (Sandbox Code Playgroud)


如果PrimaryKey UpdateUserCreditsLeft不是UserID,则在FULL OUTER JOIN中使用它.

  • 很好的答案,这个拯救了我今天的工作 (2认同)

小智 26

没有updated动态表. 只有inserteddeleted.在UPDATE命令上,旧数据存储在deleted动态表中,新值存储在inserted动态表中.

把它想象UPDATE成一个DELETE/INSERT组合.