2010-02-08 28 views
1

我在MySQL中使用觸發器來記錄對數據的更改。這些更改將記錄在行級別上。我現在可以在我的日誌表中爲每個更改的行插入一個條目。但是,我還需要記錄更改所屬的操作。如何使用MySQL觸發器對操作進行分組

例如,「DELETE * FROM table WHERE type = x」等刪除操作可以刪除多行。與觸發我可以插入刪除的每一行到日誌表中的條目,但我想也提供了整體運行的唯一標識符,從而使日誌表如下所示:

log_id operation_id tablename fieldname oldvalue newvalue 

1  1    table  id   1   null 
2  1    table  type  a   null 
3  1    table  id   2   null 
4  1    table  type  a   null 
5  2    table  id   3   null 
6  2    table  type  b   null 
7  2    table  id   4   null 
8  2    table  type  b   null 

MySQL中有一種方法可以識別行更改所屬的更高級別的操作嗎?或者這隻能通過應用程序級代碼來實現?在將來,能夠記錄操作所屬的交易也是很好的。

另一個問題是,如果可以捕獲實際的SQL查詢,除了使用查詢日誌。我自己並不這麼認爲,但也許我錯過了一些東西。當然可以在應用程序級捕獲這些數據,但目標是儘可能減少對應用程序級代碼的入侵。

當MySQL無法做到這一點時,這與其他數據庫系統有什麼關係?對於目前的項目來說,使用MySQL之外的其他項目是不行的,但是對於未來的項目來說,這將是一件好事。

編輯 在僞代碼我想實現下面這種觸發的:

CREATE TRIGGER tablename_log_insert 
AFTER INSERT ON tablename 
INSERT INTO log_operations (operation_type, relation) VALUES ('insert', 'tablename'); 
SET @operation_id = LAST_INSERT_ID(); 
FOR EACH ROW 
BEGIN 
    INSERT INTO log_tablename(@operation_id, ...) VALUES (@operation_id, ...); 
END; 

我知道這是不是爲MySQL是正確的,但也許這僞代碼有助於澄清我的問題。

+0

爲什麼你不想使用查詢日誌? – eggyal 2012-05-14 15:47:13

+0

我需要在實時數據庫的觸發器中分配操作ID,我不想以後使用日誌。 – 2012-05-14 15:56:10

+0

您可以登錄到(實時)表...請參閱http://dev.mysql.com/doc/en/log-destinations.html – eggyal 2012-05-14 15:57:47

回答

0

使用MySQL general query log,它使您能夠捕獲已執行的確切聲明。無論是寫入文件還是表格,您都可以使用choose

+0

我有一個工作實現,所以感謝您的幫助。我會盡快批准賞金。 – 2012-05-15 11:45:03

1

基於觸發器的創建,你知道一些上下文:delete,insert,update。

CREATE TRIGGER <name_of_trigger> 
    [BEFORE | AFTER] 
    [UPDATE | INSERT | DELETE] -- Dictates context for trigger 'action'. 
ON <table_name> 
FOR EACH ROW BEGIN 
    <SQL to execute> 
END 

如果添加一個「動作」列到你的日誌,你可以再告訴使用什麼動作以引起記錄被插入到「變」登錄。

例子:

DELIMITER $$ 

-- Create Update,Insert,Delete triggers that logs the result of a table update to a log 
CREATE TRIGGER trg_AFT_INS_table AFTER UPDATE ON table 
FOR EACH ROW BEGIN 
    INSERT INTO table_log (a, b, c, d, action) 
    VALUES (NEW.a, NEW.b, NEW.c, NEW.d, "update"); 
END $$ 
CREATE TRIGGER trg_AFT_INS_table AFTER INSERT ON table 
FOR EACH ROW BEGIN 
    INSERT INTO table_log (a, b, c, d, action) 
    VALUES (NEW.a, NEW.b, NEW.c, NEW.d, "insert"); 
END $$ 
CREATE TRIGGER trg_AFT_INS_table AFTER DELETE ON table 
FOR EACH ROW BEGIN 
    INSERT INTO table_log (a, b, c, d, action) 
    VALUES (OLD.a, OLD.b, OLD.c, OLD.d, "delete"); 
END $$ 

記錄表的修改時,您可以進入VS後的討論之前......我們發現,使用「後」的價值觀,使日誌有效地同爲「二進制日誌'並且可以用來重建(包括最後一次修改)記錄所在的表。

- J·喬根森 -

相關問題