2014-10-06 60 views
-2

我試圖創建完成以下更新觸發問題之前

觸發檢查場ACTION_TYPE行中,它是具有更新請求

如果行(更新前的值)有一個ACTION_TYPE爲空,我想插入值/字符串「更改」。

如果行(更新之前)有一個包含字符串'Add'的ACTION_TYPE,我希望保持該值。

如果行(更新之前)有一個包含字符串'Change'的ACTION_TYPE,我希望保留該值。

CREATE TRIGGER tbl8_change 
ON HOLIDAY_DATE_TABLE 
BEFORE UPDATE 
AS 
BEGIN 

IF ((SELECT ACTION_TYPE FROM HOLIDAY_DATE_TABLE 
WHERE 
inserted.HID = HOLIDAY_DATE_TABLE.HID) == NULL) THEN 
INSERT INTO HOLIDAY_DATE_TABLE (ACTION_TYPE) 
VALUES ('Changed') 
WHERE inserted.HID = HOLIDAY_DATE_TABLE.HID; 


IF ((SELECT ACTION_TYPE FROM HOLIDAY_DATE_TABLE 
WHERE 
inserted.HID = HOLIDAY_DATE_TABLE.HID) == 'Changed') THEN 
INSERT INTO HOLIDAY_DATE_TABLE (ACTION_TYPE) 
VALUES ('Changed') 
WHERE inserted.HID = HOLIDAY_DATE_TABLE.HID; 


IF ((SELECT ACTION_TYPE FROM HOLIDAY_DATE_TABLE 
WHERE 
inserted.HID = HOLIDAY_DATE_TABLE.HID) == 'Add') THEN 
INSERT INTO HOLIDAY_DATE_TABLE (ACTION_TYPE) 
VALUES ('Add') 
WHERE inserted.HID = HOLIDAY_DATE_TABLE.HID; 

END 

我的語法有點不對,任何幫助將不勝感激。

+0

而不是將插入的錶鏈接到基表,您可以檢查已刪除的表。另外,如果您執行INSERT而不是UPDATE,則您現有的行將保留在表中。 – 2014-10-06 18:12:54

+3

SQL Server沒有'BEFORE'觸發器.....只有'AFTER/ON'或'INSTEAD OF ....' – 2014-10-06 18:17:13

+0

檢出'INSTEAD OF'觸發器[使用INSTEAD OF觸發器](http: //www.mssqltips.com/sqlservertip/1804/using-instead-of-triggers-in-sql-server-for-dml-operations/) – Tak 2014-10-06 18:55:19

回答

0

您可以使用具有相同效果的AFTER觸發器;

CREATE TRIGGER trg_hdt ON holiday_date_table 
AFTER UPDATE AS 
BEGIN 
    UPDATE hdt SET hdt.action_type='Change' 
    FROM holiday_date_table hdt JOIN inserted i ON hdt.id = i.id 
    WHERE hdt.action_type IS NULL 
END; 

An SQLfiddle to test with

基本上它所做的是將所有更新的行與表本身連接起來,並更改匹配的適當值。

+0

不要以爲你的解決方案會根據Dave的要求工作,不要更新的時候初始值是「Add」。 – Tak 2014-10-06 19:29:40

+0

@t_m SQLfiddle顯示了這一點,「添加」行不會改變。 – 2014-10-06 19:31:50

+0

@JoachinIsaksson ..我可能誤解了OP,但我想更新是..'UPDATE holiday_date_table SET ACTION_TYPE ='更改';'而不是使用另一列。 – Tak 2014-10-06 19:36:53