2014-10-06 74 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