1

我需要跟踪 MySql 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 ;

替代文字 http://pssnet.com/~devone/pssops3/testing/callprocedure.png

4

1 回答 1

2

我想你会发现这个存储过程不会创建触发器;它创建 SQL 语句来创建触发器。将此过程的输出喷射到某个文件中,然后运行它。

查看输出,其中似乎有一些虚假的竖线字符,可能会带来麻烦;我的视力可能不是这样,所以我不能确定。

于 2010-05-10T13:12:08.540 回答