首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL数据库审核跟踪触发器

MySQL数据库审核跟踪触发器
EN

Stack Overflow用户
提问于 2010-05-07 05:16:46
回答 1查看 4.2K关注 0票数 1

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

我有一个包含以下列的AuditLog表: AuditLogID、TableName、RowPK、FieldName、OldValue、NewValue、TimeStamp。

mysql存储过程如下所示(这将正常执行,并创建该过程):

对该过程的调用,例如: call addLogTrigger('ProductTypes','ProductTypeID');将会执行,但不会创建任何触发器(见下图)。显示触发器返回空集。

请让我知道什么可能是问题,或实现这一点的替代方法。

代码语言:javascript
复制
    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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-05-10 21:12:09

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2784563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档