2016-09-01 4 views
0

トリガーを使用するのは初めてですが、かなり読んだことがあります。私は、従業員と呼ばれるmysqlのテーブルを持っており、従業員に加えられた変更の監査証跡をemployee_changesという別のテーブルに作成したいと考えています。しかし、私は、employees表で変更された列のみの監査項目を作成したいと考えています。たとえば、ユーザーが従業員の給与を変更した場合、従業員のID、変更された列の名前(この場合は給与)、以前の値と新しい値が取得されたemployee_changesに行が作成されます。給与およびユーザーの日付と名前を入力します。変更を加えたユーザーの名前は、レコードがフロントエンドに保存されるときにemployeesテーブルのフィールド(LastUpdatedBy)で常に更新されるため、トリガーが起動するまでに、ユーザー名をLastUpdatedBy列。私はこのコードを思い付くことができたThis PostThis Postの助けを借りてmysqlでトリガーを作成して、あるテーブルの変更を別のテーブルに保存する

DELIMITER // 
CREATE TRIGGER emp_update 
AFTER INSERT 
ON employees FOR EACH ROW 
BEGIN 
DECLARE col_names CURSOR FOR 
SELECT column_name 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE table_name = 'employees' 
ORDER BY ordinal_position; 
select FOUND_ROWS() into num_rows; 
SET i = 1; 
the_loop: LOOP 
IF i > num_rows THEN 
    CLOSE col_names; 
    LEAVE the_loop; 
END IF; 

FETCH col_names 
INTO col_name;  

IF OLD.col_name <> NEW.col_name THEN 
    INSERT INTO employee_changes (EmployeeNumber, FieldName, OldValue, NewValue, ChangeDate, ChangedBy) 
    VALUES(OLD.EmployeeNumber, col_name, OLD.col_name, NEW.col_name, NOW(), NEW.LastUpdatedBy); 
END IF; 

SET i = i + 1; 
END LOOP the_loop; 

END // 
DELIMITER ; 

しかし、私はそれを実行すると、何も起こらない、何のトリガーはINFORMATION_SCHEMA.TRIGGERSに作成されません。従業員テーブルを更新すると、employee_changesテーブルで何も起こりません。

私はほとんどそこにいるように感じますが、私は立ち往生しています。

ありがとうございました。

+0

エラーメッセージ(WorkbenchやMySQLクライアントなど)を読むことができる場所でコードを実行してください。あなたのコードにいくつかのエラーがあります(変数宣言、 'insert'トリガで' old'を使う)。 – Solarflare

答えて

0

次の行は間違いなくエラーがスローされます:

IF OLD.col_name <> NEW.col_name THEN 

COL_NAMEは、フィールドの名前ではありませんので、それは変数です。これはMySQLでは動作しません。正確なカラム名を指定する必要があります。列名の動的クエリは忘れて、各列のテストをハードコードする必要があります。

同様に、挿入文では、OLD.col_nameまたはNEW.col_nameの式を使用することはできません。フィールド名を1つずつ明示的に指定する必要があります。テーブルの構造を変更する場合は、トリガーのコードを変更する必要があります。

これはMySQLの制限事項ですが、現時点ではこの問題の解決策または回避策は認識されていません。

+0

シャドウありがとうございますが、かなりの数のフィールドを持つ数十のテーブルがあります。私はおそらく同じ結果を達成する別の方法がありますか? –

+0

残念ながら、これはMySQLの制限です。現在、私はこの問題の解決策や回避策をmysqlで認識していません。アプリケーションレベルでロギングを実装しようとすると(アプリケーションでどのデータが変更されているかを知っている)、MySQLバイナリログを有効にしてから、mysqlbinlogアプリケーションを使用してバイナリログを処理し、定期的にすべての変更を収集する可能性があります。 – Shadow

関連する問題