簡體   English   中英

我正在尋找一種僅在表1的值發生變化的情況下將觸發器插入第二個表的方法

[英]I am looking for a way for a trigger to insert into a second table only where the value in table 1 changes

我正在尋找一種僅將表1中的值更改的地方插入第二張表的觸發器的方法。 從本質上講,它是一種捕獲任何更改的審核工具。 表1中的字段是price,我們要編寫其他字段。

到目前為止,這就是我所擁有的。

CREATE  TRIGGER zmerps_Item_costprice__update_history_tr ON [ITEM] 
FOR UPDATE
AS
insert into zmerps_Item_costprice_history
        select  NEWID(), -- unique id
                GETDATE(),  -- CURRENT_date
                'PRICE_CHANGE', -- reason code
                a.ima_itemid, -- item id
                a.ima_price-- item price

            FROM  Inserted b inner join item a
                    on b.ima_recordid = a.IMA_RecordID

該表僅包含唯一標識符,日期,參考(項目)和更改的字段(價格)。 它會寫任何變化,而不僅僅是價格變化

這樣簡單嗎? 我移動了一些代碼,因為列之間的逗號后的注釋很難維護。 您還應該始終在插入語句中指定列。 如果您的表更改,此代碼仍將起作用。

CREATE  TRIGGER zmerps_Item_costprice__update_history_tr ON [ITEM] 
FOR UPDATE
AS
insert into zmerps_Item_costprice_history
(
    UniqueID
    , CURRENT_date
    , ReasonCode
    , ItemID
    , ItemPrice
)
    select  NEWID()
        , GETDATE()
        , 'PRICE_CHANGE'
        , d.ima_itemid
        , d.ima_price
    FROM Inserted i 
    inner join deleted d on d.ima_recordid = i.IMA_RecordID
        AND d.ima_price <> i.ima_price

由於您沒有提供任何其他列名,因此在下面的示例中,我使用了Column2和Column3以及“其他”列名。

您可以在下面的代碼中展開添加更多列。

有關以下查詢的概述:

將已刪除和插入的表(僅針對已更改的行)連接到表本身,將導致對根本沒有更改的行進行不必要的處理。

如果列的值沒有更改,我已經使用NULLIF函數來產生一個空值。

將所有列轉換為相同的數據類型(unpivot必需)。

使用unpivot從結果集中消除所有空值。

unpivot還將為您提供已取消透視的列名。

CREATE  TRIGGER zmerps_Item_costprice__update_history_tr 
ON [ITEM] 
FOR UPDATE
AS 
BEGIN
  SET NOCOUNT ON ;

WITH CTE AS (
SELECT  CAST(NULLIF(i.Price   , d.Price)    AS NVARCHAR(100)) AS Price
       ,CAST(NULLIF(i.Column2 , d.Column2)  AS NVARCHAR(100)) AS Column2
       ,CAST(NULLIF(i.Column3 , d.Column3)  AS NVARCHAR(100)) AS Column3
FROM dbo.inserted i 
INNER JOIN dbo.deleted d ON i.IMA_RecordID = d.IMA_RecordID
WHERE i.Price   <> d.Price
 OR   i.Column2 <> d.Column2
 OR   i.Column3 <> d.Column3
 )
 INSERT INTO zmerps_Item_costprice_history
               (unique_id, [CURRENT_date], [reason code], Item_Value)
 SELECT  NEWID()
        ,GETDATE()
        ,Value
        ,ColumnName + '_Change'
 FROM CTE UNPIVOT (Value FOR ColumnName IN (Price , Column2, Column3) )up

END

據我正確理解您的問題,您要記錄更改僅且僅當列價格值已更改時,您才需要記錄其他任何列更改

這是你的代碼

CREATE  TRIGGER zmerps_Item_costprice__update_history_tr ON [ITEM] 
FOR UPDATE
AS
if update(ima_price)
insert into zmerps_Item_costprice_history
    select  NEWID(), -- unique id
            GETDATE(),  -- CURRENT_date
            'PRICE_CHANGE', -- reason code
            a.ima_itemid, -- item id
            a.ima_price-- item price

        FROM  Inserted b inner join item a
                on b.ima_recordid = a.IMA_RecordID

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM