2012-04-03 10 views
1

バイナリログにデータを書き込まずに、トリガまたはストアドプロシージャを使用してテーブルにローを挿入しようとしています。これは可能ですか?通常の接続では、接続のバイナリロギングを無効にするようにSQL_LOG_BIN=0を設定できますが、そのトリガで動作するようにはできませんでした。フェデレーションエンジンのテーブルでこれを行う方法があれば、それもOKです。バイナリログに書き込むことなくトリガを実行

編集:私は、MySQLプロンプトからプロシージャを呼び出すことでレコードを挿入

CREATE PROCEDURE nolog_insert(`id` INT, `data` blob) 
BEGIN 
    SET SESSION SQL_LOG_BIN = 0; 
    INSERT INTO `table` (`id`, `data`) VALUES (id, data); 
    SET SESSION SQL_LOG_BIN = 1; 
END 

私はほとんどのストアドプロシージャを経由して、これを達成することができます

call nolog_insert(50, 'notlogged'); 

として、レコード(50, 'notlogged')tableに挿入されますが、バイナリには書き込まれませんログ。

ただし、この手順をトリガーから実行したいとします。トリガを使用する場合、以下のように:

create trigger my_trigger before insert on blackhole_table for each row call nolog_insert(new.id, new.data); 

データの両方tableに挿入され、バイナリログに書き込まれます。

+0

ほとんどのDBMSは、トランザクションがロールバックされた場合の変更を追跡するためにログを使用し、ログに書き込まずに何かが失敗した場合、そのロールバック機能が壊れています。私はこれがMySQLに当てはまるかどうかはわかりませんが、それはIMOを気にするものです。 –

+0

ええ、私はその意味を認識しています。それはMyISAMによってサポートされ、トランザクションはとにかく使用されません。インサートは決して失敗しないはずです。 (ストアドプロシージャは、MySQLレプリケーションの制限を回避するために、システムの一部として使用されています。) – alberge

+0

挿入に失敗しただけではなく、問題です。これは、トランザクション中の挿入(IOW、トランザクションの整合性が損なわれているため、トランザクションの開始から失敗のポイントまでの間の何かを元に戻すことはできません)の間の操作です。あなたは現在トランザクションを使用していないかもしれませんが、将来そのトランザクションが変更され、トリガーの変更が間に合わない場合はどうなりますか? –

答えて

1

ステートメントベースのレプリケーションを実行する場合トリガーはマスターとスレーブの両方で実行されますが、レプリケートされません。多分あなたの問題を解決できるかもしれません。私はトリガーない行ベースのレプリケーションを使用した場合、複製の効果を持っている良い方法がないことだと思いますので、それ以外は

は、トランザクション内sql_log_binを変更することが許可されていません。

関連する問題