2015-06-08 3 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

Спасибо, тень, я попробовал шарик на ответе двух других людей. Оба они очень хороши. –

Смежные вопросы