2016-04-28 27 views
2

我有一個表是這樣的:如何分析,發生了什麼,而更新行

| id | address | name | oid | state | event_id | ctrl | 
------------------------------------------------------------------- 
| 1 | test_addr_1 | test_1 | 25.345.17 | 1 |  0 | 15 | 

我需要得到事項標識行,同時更新數據。

我想要做這樣的事情:

如果新的名稱不能與舊名稱等於event_id = event_id + 1
如果新的OID不可用舊OID event_id = event_id + 2
如果新狀態不與舊的狀態等於等於event_id = event_id + 4
如果新CTRL更大然後老CTRL event_id = event_id + 8

# Params to procedure 
PROCEDURE Write(IN pAddr VARCHAR(20), IN pName VARCHAR(20), IN pOid VARCHAR(20), IN pState TINYINT, IN pCtrl INT) 

#procedure body 
SET @ev = 0; 
SELECT 
CASE 
    WHEN name != pName THEN SET @ev = @ev + 1 
    WHEN oid != pOid THEN SET @ev = @ev + 2 
    WHEN state != pState THEN SET @ev = @ev + 4 
    WHEN ctrl > pCtrl THEN SET @ev = @ev + 8 
END 
FROM table1 

UPDATE table1 SET ..... , event_id = @ev WHERE address = pAddr 

我該怎麼辦呢?或者,最好不要藉助SQL?

+0

這聽起來好像觸發更新後會是更好的選擇在這裏。順便說一句,你能確定你的多個條件不會同時發生嗎? –

回答

0

解決了!感謝@Alexei。 我想知道,爲什麼行被添加到歷史表。

結果是:

CREATE TRIGGER SetReason BEFORE UPDATE ON <table1> 
FOR EACH ROW BEGIN 
    SET NEW.event_id = 
     (CASE WHEN OLD.name != NEW.name THEN 1 ELSE 0 END) + 
     (CASE WHEN OLD.oid != NEW.oid THEN 2 ELSE 0 END) + 
     (CASE WHEN OLD.state != NEW.state THEN 4 ELSE 0 END) + 
     (CASE WHEN OLD.ctrl != NEW.ctrl THEN 8 ELSE 0 END)  
END; 
0

如前所述,可以使用audit trigger來確保捕獲來自所有來源的更改。不過,我建議兩個變化:

1)審計表 - 用其他的表來保存審計數據,因爲這些表往往成長,不建議混合在相同結構的操作和審計的數據(即使在相同的數據庫)

2)使用更友好的更改標誌 - 從你的例子看來,你似乎是設置位的整數值。雖然這提供了緊湊的數據(在單個整數內捕獲許多更改),但它需要更多複雜的操作來查看名稱更改的時間。審計表可以簡單地具有BIT(1)列像nameChangedoidChanged

CREATE TRIGGER table1Audit BEFORE UPDATE ON <table1> 
FOR EACH ROW BEGIN 
    SET @ev = 
     (CASE WHEN OLD.name != NEW.name THEN 1 ELSE 0 END) + 
     (CASE WHEN OLD.oid != NEW.oid THEN 2 ELSE 0 END) + 
     (CASE WHEN OLD.state != NEW.state THEN 4 ELSE 0 END) + 
     (CASE WHEN OLD.ctrl != NEW.ctrl THEN 8 ELSE 0 END) 

    -- INSERT INTO someaudittable 
    --'table1', @ev 
END; 
+0

謝謝!這對我有幫助。我知道,如果價值觀不同,會發生什麼。這個想法是:如果ev == 1(對象被重命名),如果ev == 4(對象可能工作),如果ev == 12(對象不工作)等等。更新event_id並將此行插入歷史表。是否有可能在同一個表中更新evend_it? – txid