2013-09-26 113 views
1

開始時,應用程序有一個adminsemployeesrecords識別數據庫中的編輯列

記錄表有許多列,可以由任何員工更改。但是,此更改無法提交。當管理員批准編輯時,記錄將在系統中再次顯示。

我試圖確定列的名稱和值,並將其發送到另一個使用UPDATE觸發器的表。

所以當員工編輯任何記錄時,該記錄將在系統中被禁用。此外,管理員將能夠知道哪些值已被更改。

這是可能的數據庫?

Records Table 
------------------------------------------------------------------- 
record_id  record_name  record_serial  record_active 
------------------------------------------------------------------- 
    1   something   5151     YES 

當更新發生在record_serial,比如從5151到9844時,我需要這樣做。

Records_changes 
------------------------------------------------------------------- 
change_id   record_col  record_old_val  record_new_val 
------------------------------------------------------------------- 
    1   record_serial   5151     9844 

同時

------------------------------------------------------------------- 
record_id  record_name  record_serial  record_active 
------------------------------------------------------------------- 
    1   something   9844     NO 

我可以用我的應用程序做到這一點,但如果有反正使用的數據庫做這將是更好。

我將使用它來跟蹤更改,併爲記錄舊值創建歷史記錄。

我使用MySQL

+0

哪個數據庫引擎? – JimiDini

+0

使用命令行的MySQL。 – Othman

+0

我在想通過應用程序來做這件事會更容易。但我很好奇,是否有人有任何想法通過數據庫來做到這一點。 – Tom

回答

1

你可以做這樣的事情

DELIMITER $$ 
CREATE TRIGGER tg_bu_records 
BEFORE UPDATE ON records 
FOR EACH ROW 
BEGIN 
    IF NOT (OLD.record_serial <=> NEW.record_serial AND 
      OLD.record_name <=> NEW.record_name) THEN 
    SET NEW.record_active = 0; 
    END IF; 
END$$ 

CREATE TRIGGER tg_au_records 
AFTER UPDATE ON records 
FOR EACH ROW 
BEGIN 
    IF NOT (OLD.record_serial <=> NEW.record_serial) THEN 
    INSERT INTO records_changes (record_col, record_old_val, record_new_val) 
    VALUES ('record_serial', OLD.record_serial, NEW.record_serial); 
    END IF; 
    IF NOT (OLD.record_name <=> NEW.record_name) THEN 
    INSERT INTO records_changes (record_col, record_old_val, record_new_val) 
    VALUES ('record_name', OLD.record_name, NEW.record_name); 
    END IF; 
END$$ 
DELIMITER ; 

注:關鍵是要改變record_active標誌BEFORE觸發器,因爲它的時候,你可以更改值的唯一事件一行正在更新/插入您定義該觸發器的表格中。現在在AFTER觸發器中記錄已經做出的更改。

這裏是SQLFiddle演示

0

的一個很好的數據庫模式,如果我正確理解你的問題,是使用版本行。您可以添加列(或附加引用表)與元數據有關何時/誰/編輯的內容。編輯記錄時,會插入一個新行。以前的版本從不修改或刪除。然後由您的應用程序邏輯決定如何處理所有這些。