我需要跟踪MySql Db中某些表中的更改(审计跟踪)。我正在尝试实现here建议的解决方案。
我有一个包含以下列的AuditLog表: AuditLogID、TableName、RowPK、FieldName、OldValue、NewValue、TimeStamp。
mysql存储过程如下所示(这将正常执行,并创建该过程):
对该过程的调用,例如: call addLogTrigger('ProductTypes','ProductTypeID');将会执行,但不会创建任何触发器(见下图)。显示触发器返回空集。
请让我知道什么可能是问题,或实现这一点的替代方法。
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
发布于 2010-05-10 21:12:09
我想您会发现这个存储过程并不创建触发器;它创建SQL语句来创建触发器。将此过程的输出压缩到某个文件中,然后运行它。
看一下输出,里面似乎有一些虚假的竖线字符,这可能会带来麻烦;我的视力不是它可能的样子,所以我不能确定。
https://stackoverflow.com/questions/2784563
复制相似问题