2017-02-17 6 views
0

私はすべてのデータ更新を記録するトリガーを書き込みましたが、previous_value, new_value, field_name以上のログを記録します。しかし、問題は私が77フィールド私のテーブルにあります。それで、各フィールドにIF ENDIFを書くのは難しいので、私はループを使って書くことが可能であることを知りたいですか?助けてください、私がこれまで試してみました::更新後にトリガーを書きたい

BEGIN 

IF(OLD.company_name != NEW.company_name) THEN 
INSERT INTO elm_activity_log (user_id, action_on, action, action_col, action_old_value, action_new_value, action_at, action_on_id) VALUES (NEW.updated_by, "company", "update", "company_name", OLD.company_name, NEW.company_name, CURRENT_TIMESTAMP(), NEW.company_id); 
END IF; 
IF(OLD.company_first_name != NEW.company_first_name) THEN 
INSERT INTO elm_activity_log (user_id, action_on, action, action_col, action_old_value, action_new_value, action_at, action_on_id) VALUES (NEW.updated_by, "company", "update", "company_first_name", OLD.company_first_name, NEW.company_first_name, CURRENT_TIMESTAMP(), NEW.company_id); 
END IF; 

END 

をすでにdba.stackexchange.comに尋ねたが、まだfruitfull答えが得られませんでした、リンクの下::

Link

、または任意の提案は非常に役に立つでしょう。

ありがとうございます。

+1

ないでキャリッジリターンで終わる必要がありますいくつかの/nを追加したことを

注意。私はinformation_schema.columnsの内容をExcelにダンプし、そこでコードを構築します。 –

答えて

1

これを自動的に行うことはできませんが、私はあなたのことを理解しています。あなたが賢明である限り、怠け者であることは実際にはコンピュータサイエンスの質です。

私は通常、この種の問題を「自動プログラミング」で克服します。コードを生成するコードを作ることです。

あなたのSQL文を生成するための2つのオプションがあります:

1. Pure SQL 
2. Programming language 

はここでSQLを使用したソリューションの始まりだ:

SELECT 
    CONCAT 
    (
     'IF(OLD.company_name != NEW.company_name) THEN \n 
     INSERT INTO elm_activity_log (user_id, action_on, action, action_col, action_old_value, action_new_value, action_at, action_on_id) VALUES (NEW.updated_by, "company", "update", "', T.column_name,'", OLD.', T.column_name, ', NEW.', T.column_name,', CURRENT_TIMESTAMP(), NEW.company_id); \n 
     END IF; \n 
     \n 
     ' 
    ) as SQLstatement 

FROM 
(
    SELECT column_name 
    FROM information_schema.columns 
    WHERE column_name NOT IN ('id') 
     AND table_name = 'your_table' 
     AND table_schema = 'database_name' 
) T 

それはまっすぐに、それはlitlleビットを書き換えることが必要になる場合があります働くかもしれないが。テーブルDLLを提供していないので、動作するかどうかはほとんどテストできません。

考えられるのは、各列のトリガー部分のSQLステートメントを含む列名ごとに行を生成することです。このクエリの結果をテキストファイルにエキスポートすることができます。

したがって、ネストされたクエリ:table_name、table_schema、およびログから除外する列(私は 'id'を設定します)に適応します。 SELECT CONCATで、私は出力のmysql内

関連する問題