2009-06-24 5 views
1

私はMySQLでバックアップされているアプリでAudit Trailを最適に実装する方法を検討しています。いくつかのシステムが同じデータベースとテーブルにアクセスするので、私はトリガーが最善の解決策であると考えました。MySQLの副選択からフィールド=>値のペアを取得する方法はありますか?

しかし、手動でテーブルごとにトリガを書きたくないので、各挿入/削除のフィールド名とデータを自動的に記録するようにしています。等

何か:

INSERT INTO `audits` SET 
    `table_name` = 'jobs', 
    `table_key` = OLD.`id`, 
    `changed_at` = NOW(), 
    `notes` = (SELECT * FROM NEW); 

しかし、副選択文字列として扱うことができない単一の行の結果セットを返します。私はその行を取ってそれに変換する関数を望んでいます:

"id = 1, name = 'something', another_field = 'data'" 

またはそういうものです。

編集:ここでのポイントは、すべてのテーブルのすべてのフィールドに入力する必要はないということです。 120以上のテーブルがあり、100以上のフィールドがあります。 MySQL自体では不可能な場合は、それぞれのテーブルとフィールドを回転させてSQLを生成するための小さなプログラムを作成します。 yourtable

FROM

答えて

0

私は最終的には、関連する各テーブルの上にループするPHPスクリプトを書いて、私のためのトリガーを構築します。

0

のみ

SELECT GROUP_CONCAT(COL1)が、これは、カンマ区切りまたはあなたが宣言することができ、他のセパレータですべてのフィールドを返します。

link

1
SELECT CONCAT('id = ', id, ', name = ''', name, ''', another_field = ''', data, '''') 
FROM NEW 
0

あなただけの文字列を連結することができます。

例えば:

select concat("id = ", t.id, "name = ", t.name) from myTable t; 
+0

ポイントは、すべてのテーブルのすべてのフィールドに入力する必要はないということです。 120以上のテーブルがあり、100以上のフィールドがあります。 これが可能でない場合、私は各テーブルとフィールドを回転してSQLを生成するための小さなプログラムを書く必要があると思います。 – Drarok

関連する問題