2015-06-08 136 views
0

我不知道如何創建此歷史觸發器。創建歷史觸發器SQL Server 2012

想象一下,我們想存儲每個項目的價格變化歷史。爲此,我們首先需要創建一個Item_price_history表,該表至少存儲對該項目的引用,其舊價格,其新價格以及更改日期。然後,我們可以在Item 表上定義一個觸發器,每當物品價格更新時更新Item_price_history表。

我創建瞭如下兩個表:

CREATE TABLE ITEM(
item_id DECIMAL(10) NOT NULL, 
description VARCHAR(30), 
price DECIMAL(10), 
PRIMARY KEY (item_id)); 

CREATE TABLE Item_price_history (
history_id DECIMAL(10) NOT NULL, 
item_id DECIMAL(10) NOT NULL, 
old_price DECIMAL(10,2), 
new_price DECIMAL(10,2), 
date_of_change DATE, 
PRIMARY KEY (HISTORY_ID), 
FOREIGN KEY (ITEM_ID) REFERENCES item);           
+0

看到這個http://stackoverflow.com/questions/4200407/table-history-trigger-in-sql-server也看到這個http://stackoverflow.com/help –

+0

你想要觸發或者任何其他方式維護Item_price_history @zichen ma – mohan111

回答

0

這裏是觸發:

CREATE TRIGGER trHistory ON dbo.ITEM 
FOR UPDATE --only for update 
AS 
BEGIN 

    IF UPDATE(price) --if price is really updated and not the other columns 
    BEGIN 
     INSERT INTO dbo.Item_price_history(item_id, old_price, new_price, date_of_change) 
     SELECT d.item_id, d.price, i.price, GETDATE() 
     FROM Deleted d 
     JOIN Inserted i ON d.item_id = i.item_id 
    END   
END 
0

試試這個。

CREATE TRIGGER Sample ON Item_price_history 
FOR UPDATE 
AS 
BEGIN 

    DECLARE @nOldPRICE AS DECIMAL(10) 

    SET @nOldPRICE = (SELECT price FROM DELETED) 

    INSERT INTO Item_price_history (item_id, old_price, new_price, date_of_change) 
    SELECT item_id, @nOldPRICE, new_price, GETDATE() FROM INSERTED 

END 

enter image description here

+0

謝謝庫馬爾,我試過這個。它運作良好。 –

0

爲了確保您可以使用觸發器。但爲什麼? 當您更新主表並將所有業務邏輯保存在一個位置時,您可以更新歷史記錄表。

我記得過去,在一次編程SQL2000研討會期間,有人告訴我:「避免使用觸發器,大多數情況下他們試圖解決設計問題。」

Some info

+0

謝謝你的影子,我已經試過了其他兩個人的答案。他們都很好。 –