代码之家  ›  专栏  ›  技术社区  ›  Natkeeran

mysql db审计跟踪触发器

  •  2
  • Natkeeran  · 技术社区  · 14 年前

    我需要跟踪mysql数据库中某些表中的更改(审计跟踪)。我正在尝试实现建议的解决方案 here .

    我有一个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 回复  |  直到 14 年前
        1
  •  1
  •   Brian Hooper    14 年前

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

    从输出来看,其中似乎有一些虚假的垂直条字符可能会带来麻烦;我的视力不是它可能是什么,所以我不能确定。