繁体   English   中英

SQL触发器-删除还是更新? 还是其他?

[英]SQL Triggers - Deleted or Updated? or maybe something else?

我试图弄清楚我需要在这里使用的内容:删除,插入或更新。

基本上。

当主表更新时,并且仅当状态从某种状态变为挂起状态或活动状态时,我才需要向历史表中写入一些数据。

这就是我现在所拥有的:

ALTER TRIGGER [dbo].[trg_SourceHistory]  ON [dbo].[tblSource]
FOR UPDATE AS  
    DECLARE @statusOldValue char(1) 
    DECLARE @statusNewValue char(1)

    SELECT @statusOldValue = statusCode FROM deleted 
    SELECT @statusNewValue= statusCode FROM updated

    IF (@statusOldValue <> @statusNewValue) AND 
       (@statusOldValue = 'P' or @statusOldValue = 'A')
    BEGIN TRY
       INSERT * INTO tblHistoryTable)  
           select * from [DELETED]

因此,我希望新数据保留在主表中,而历史记录表将被覆盖的内容进行更新...现在,它只是复制了相同的信息。 因此,更新后,我的两个表都具有相同的数据。

只有InsertedDeleted伪表-没有Updated

对于UPDATEInserted包含新值(更新后), Deleted包含旧值更新前。

另请注意 ,触发器每批触发一次,而不是每行触发一次 因此,两个伪表都可能包含多个行 不要只假设一行并将其分配给变量-这

SELECT @statusOldValue = statusCode FROM deleted 
SELECT @statusNewValue= statusCode FROM updated

如果您有多行, 将失败 您需要以这样的方式编写触发器,使其可以在“ Inserted和“ Deleted使用多行

更新:是的- 写这一个更好的方法:

ALTER TRIGGER [dbo].[trg_SourceHistory]  ON [dbo].[tblSource]
FOR UPDATE 
AS  
   INSERT INTO dbo.tblHistoryTable(Col1, Col2, Col3, ...., ColN)
      SELECT Col1, COl2, Col3, ..... ColN
        FROM Deleted d
        INNER JOIN Inserted i ON i.PrimaryKey = d.PrimaryKey
        WHERE i.statusCode <> d.statusCode
          AND d.statusCode IN ('A', 'P')

基本上:

  • 明确指定要插入的列-在INSERT语句和SELECT语句中都检索要插入的数据-避免任何令人讨厌的意外

  • InsertedDeleted伪表之间创建一个INNER JOIN以获取所有已更新的行

  • SELECTWHERE子句中指定所有其他条件(不同的状态代码等)

此解决方案适用于要更新的​​批处理行-在多行更新中不会失败。

您需要同时使用inserteddeleted表来检查以下记录:
1.已经存在(检查它不是插入内容)
2.仍然存在(检查它是否不是删除项)
3.状态字段已更改

您还需要确保按照基于集合的方法进行操作,按照marc_s的回答,触发器不是单个记录过程。

INSERT INTO
  tblHistoryTable
SELECT
  deleted.*
FROM
  inserted
INNER JOIN
  deleted
    ON inserted.PrimaryKey = deleted.PrimaryKey
WHERE
  inserted.StatusCode <> deleted.StatusCode
  AND (inserted.StatusCode = 'P' OR inserted.StatusCode = 'A')
  • 插入=新值
  • 已删除=旧值

没有updated表格,您正在寻找inserted

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM