2012-05-30 33 views
0

我試圖創建該表上component操作和記錄UPDATEDELETEINSERT操作表component_historySQL服務器觸發 - 設置變量= column.value

CREATE TRIGGER component_hist 
ON component 
AFTER INSERT, UPDATE, DELETE 
AS 

DECLARE 
    @tr_action varchar(8), 
    @tr_id_compoment int, 
    @tr_name varchar(max), 
    @tr_value int 

IF COLUMNS_UPDATED() <> 0 -- delete or update? 
BEGIN  
    SET @tr_action = 'UPDATE' 
ELSE -- delete  
BEGIN 
    SET @tr_action = 'DELETE' 
END 

INSERT INTO component_history VALUES (@tr_id_component, @tr_name, @tr_value, @tr_action); 

我怎麼能發送觸發來自表component的列(id, name, value)的信息轉換爲component_history

我已經試過:

SET 
@tr_id_component = component.id, 
@tr_name = component.name, 
@tr_value = component.value 

但報道:

消息4104,級別16,狀態1,過程component_hist,第22行
多部分標識符「的組成部分。 ID「不能被綁定。

+0

這裏給你的問題的一些元素在這裏:http://stackoverflow.com/questions/1751715/sql-server-trigger-switching-insert-delete-update –

+2

假設至少有一個插入已成功處理(所以行存在於表中),'EXISTS(SELECT * FROM component)'將始終爲真。觸發器在每個語句中觸發一次,而不是每行觸發一次,因此考慮將值放入變量始終是錯誤的。 –

+0

這是第二件事,它是ORACLE的構造,但MSSQL不支持BEFORE語句,所以我現在只使用AFTER(我不知道如何解決之前):(( – gaffcz

回答

2

像這樣的東西應該足夠了:

CREATE TRIGGER component_hist 
ON component 
AFTER INSERT, UPDATE, DELETE 
AS 

INSERT INTO component_history /* I'd prefer to see a column list here */ 
select id,name,value,CASE WHEN EXISTS(select * from deleted) THEN 'UPDATE' ELSE 'INSERT' END 
from inserted 
UNION ALL 
select id,name,value,'DELETE' 
from deleted 
where not exists(select * from inserted) 

一個優化(如果你有很多的更新)將是移動EXISTS (select * from deleted)評價出SELECT的(因爲它會目前每行評估一次)。

另請注意,在UPDATE的情況下,我們只是存儲新值,而不是舊值。


inserted and deleted pseudo-tables是特殊的 - 它們含有所影響導致觸發器觸發的語句行。 inserted表包含任何新行,並且deleted表包含任何舊行。這導致在insert,deleted期間將是空的邏輯(沒有舊行受到插入的影響)。在delete期間,inserted將爲空(未創建新行)。在update期間,兩個表都被填充。

這就是爲什麼select的頂部部分適用於insertupdate操作,因爲我們使用的inserted表。但是我們檢查deleted是否有任何行,以區分這兩個操作。在底部的select(低於union all)中,我們查詢deleted表 - 但我們使用where子句來防止任何行返回,如果這實際上是update操作。

+0

)作品!非常感謝:-) – gaffcz

+0

Damien,你能解釋一下它是如何工作的嗎?它可以工作,但我不知道如何... – gaffcz

+0

@gaffcz - 我已經添加了一些解釋,猜測你想要插入和刪除信息。如果不是,你能說出哪些位不清楚嗎? –