我在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是正確的,但也許這僞代碼有助於澄清我的問題。
爲什麼你不想使用查詢日誌? – eggyal 2012-05-14 15:47:13
我需要在實時數據庫的觸發器中分配操作ID,我不想以後使用日誌。 – 2012-05-14 15:56:10
您可以登錄到(實時)表...請參閱http://dev.mysql.com/doc/en/log-destinations.html – eggyal 2012-05-14 15:57:47