更新触发器问题之前

时间:2014-10-06 18:07:39

标签: sql sql-server-2012

我试图创建一个触发器来完成以下

检查请求更新的行中的ACTION_TYPE字段的值

如果行(在更新之前)的ACTION_TYPE为空,我想插入值/字符串"更改"。

如果行(在更新之前)的ACTION_TYPE包含字符串' Add',我想保持该值不变。

如果行(在更新之前)的ACTION_TYPE包含字符串' Change',我想保持该值不变。

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

我的语法有点偏,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分: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

基本上它的作用是将所有更新的行与表本身连接起来,并更改匹配的相应值。