2012-05-18 67 views
1

我已經在尋找一個解決方案蒐羅網上尋找過去的4個小時,但所有我能找到的是:MySQL的觸發獲取當前的查詢導致觸發器觸發

你不能。 不可能。 不會發生。

我不喜歡那種方法。

我的理論是,如果它被存儲在information_schema.processlist中的某個點上,那麼就必須要抓住它。 我試圖在processlist表上運行一個觸發器,但無法讓它工作,我想是因爲它的一個視圖。 運行日誌不是一個選項,因爲這將影響性能已在服務器上,以及有許多查詢運行,我只希望它登錄在特定的表,然後只在更新..

這是傳奇的stackoverflow!在那裏你可以找到解決所有你的問題,因爲它與天才溢出!

所以,我求求你,天才在哪裏!展示你自己! :-)

感謝, 捷德

+0

我已經試過這個,我成功地獲得了在sql server 2000中工作但不在mysql中的代碼。 –

回答

0
SELECT INFO FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ... ; 
+0

這不起作用。我努力了。這裏是我嘗試過的觸發器:DELIMITER || CREATE TRIGGER DEBUG_DATE BEFORE UPDATE ON db.tbl FOR EACH ROW BEGIN \t DECLARE Q VARCHAR(1024); \t SELECT INFO INTO Q FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID(); \t INSERT INTO db.tbl_log(INFO)VALUES(Q); END || – Zedd

+0

@ user1403127:你得到了什麼錯誤?您可能會得到多個結果(至少一個用於調用觸發器的'UPDATE'命令,另一個用於觸發器正在運行的'SELECT INFO FROM INFORMATION_SCHEMA.PROCESSLIST'命令),您無法分配給它你的'Q'變量。爲什麼不只是'INSERT INTO db.tbl_log(INFO)SELECT INFO FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID();'?或者在你的'WHERE'子句中選擇性更強(考慮過濾'COMMAND'和/或'STATE')? – eggyal

+0

我也試過這個...但它導致了同樣的事情......它只是插入到tbl_log最後一次運行的查詢中...... whcih是select from proceslist – Zedd

1

這裏的問題是,MySQL的觸發範圍是行級,而不是語句級。因此,在觸發器內,您可以訪問給定行中每列的OLD和NEW值,但是您無權訪問導致觸發器觸發的語句。

關於information_schema.processlist,在該視圖中實際上沒有任何內容被「存儲」(持久化)。它只是流程列表的SQL接口,並且觸發器範圍內無法訪問導致觸發器觸發的語句。

你說你不想啓用一般查詢日誌,並且這種方法並不完美,因爲多種原因(包括event_Time的粒度爲1秒),但這裏有一個例子說明如何重寫使用general_log表的觸發器:

SET GLOBAL GENERAL_LOG='ON'; 
SET GLOBAL LOG_OUTPUT='TABLE'; 

DELIMITER || 

CREATE TRIGGER DEBUG_DATE BEFORE UPDATE ON db.tbl FOR EACH ROW 
BEGIN 
    DECLARE Q MEDIUMTEXT; 
    SELECT argument INTO Q 
    FROM mysql.general_log 
    where thread_id = connection_id() 
    order by event_time desc 
    limit 1; 

    INSERT INTO db.tbl_log (INFO) 
    VALUES (Q); 

END || 

DELIMITER ; 
0

我們研究這個問題,並發現,「聲明」並不樣本上方, 也general_log標誌應在服務器上啓用的工作。最後,我們有以下 觸發代碼:

DELIMITER $$ 

DROP TRIGGER IF EXISTS `our_trigger`$$ 
CREATE TRIGGER `our_trigger` 
BEFORE UPDATE ON `our_table_for_debug` 
FOR EACH ROW BEGIN 

SELECT argument INTO @tquery FROM mysql.general_log where thread_id = connection_id() and argument like 'update%' order by event_time desc limit 1; 
INSERT INTO `our_log_table` (`query`) VALUES (@tquery); 

END IF; 

END$$ 

DELIMITER ; 

「our_log_table」是表命名query單MEDIUMTEXT場。 要啓用通用日誌,您應該運行此查詢:general_log = 1;或直接在mysql設置中啓用它 。