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 に答える