2010-05-06 98 views
2

我需要跟蹤MySql Db中某些表中的更改(審計跟蹤)。我正在嘗試執行解決方案hereMySQL db審計跟蹤觸發器

我有一個AuditLog表,包含以下列:AuditLogID,TableName,RowPK,FieldName,OldValue,NewValue,TimeStamp。

MySQL的存儲過程是以下(在此執行細,並創建過程):

如對過程的調用:CALL addLogTrigger( 'ProductTypes', 'ProductTypeID'); 執行,但不會創建任何觸發器(請參閱圖像)。 SHOW TRIGGERS返回空集。

請讓我知道可能是什麼問題,或實現這個問題的替代方法。

DROP PROCEDURE IF EXISTS addLogTrigger; 
DELIMITER $ 
CREATE PROCEDURE addLogTrigger(IN tableName VARCHAR(255), IN pkField VARCHAR(255)) 
BEGIN 

    SELECT CONCAT(
    'DELIMITER $\n', 'CREATE TRIGGER ', tableName, '_AU AFTER UPDATE ON ', tableName, ' FOR EACH ROW BEGIN ', 
     GROUP_CONCAT(
      CONCAT(
      'IF NOT(OLD.', column_name, ' <=> NEW.', column_name, ') THEN INSERT INTO AuditLog (', 
        'TableName, ', 
        'RowPK, ', 
        'FieldName, ', 
        'OldValue, ', 
        'NewValue' 
        ') VALUES (''', 
        table_name, ''', NEW.', 
        pkField, ', ''', 
        column_name, ''', OLD.', 
        column_name, ', NEW.', 
        column_name, 
       '); END IF;' 
      ) 
      SEPARATOR ' ' 
      ), ' END;$' 
     ) 
     FROM 
      information_schema.columns 
     WHERE 
      table_schema = database() 
      AND table_name = tableName; 

END$ 
DELIMITER ; 

alt text http://pssnet.com/~devone/pssops3/testing/callprocedure.png

回答

1

我想你會發現這個存儲過程不創建觸發器;它創建SQL語句來創建觸發器。將此過程的輸出噴到某個文件中,然後運行它。

看着輸出那裏似乎有一些虛假的垂直欄字符,它可以給麻煩;我的視力並非如此,所以我不能確定。