EXECUTE SCRIPT

名前

EXECUTE SCRIPT -- SQL/DDL スクリプトの実行

概要

EXECUTE SCRIPT (オプション);

説明

レプリケーショントランザクションストリーム内での共通管理ポイントにおいて、セットに購読される全てのノード上で任意の SQL 文を含んだスクリプトを実行します。

特定の事象オリジンはセットのオリジンでなくてはなりません。スクリプトには如何なる START もしくは COMMIT TRANSACTION 呼び出しを含んではなりません。(これは PostgreSQL 8.0 で、一度だけ入れ子になったトランザクション、aka savepoints、がサポートされました。)更に、非決定性 DML 命令文(CURRENT_TIMESTAMP でフィールドを更新するような)は、スクリプトにより変更されたデータは明示的に複製されないので、回避されるべきです。

SET ID = ival

スクリプトにより影響を受けるセットの一意の数値識別子番号

FILENAME = '/path/to/file'

実行する SQL スクリプトを含んだファイル名です。これは相対パスで、今実行している slonik インスタンスの場所に相対的、もしくは、できる事なら、slonik が実行されるシステムの絶対パスです。

ファイルの内容は事象の一部として伝播されるので、ファイルはノードの全てからアクセス可能である必要はありません。

EVENT NODE = ival

(オプション)セットの現在のオリジンの識別子。デフォルト値は 1。

EXECUTE ONLY ON = ival

(オプション)スクリプトを実際に実行するだけのノードの識別子。このオプションはスクリプトを全てのノードに伝播差せますが、実行するのはたった 1 つのノードです。デフォルトはそのセットで購読される全てのノード上でスクリプトが実行されます。

項14 にある警告も参照ください。

これは、他のデータベースの活動を後ろで苦境に陥れる可能性を意味する ロックを掛ける操作であることを覚えておいてください。

この事象の開始時点で、特定のセットにある全てのテーブルは関数 alterTableRestore(tab_id) によりロックが解除されています。SQL スクリプトが実行された後、alterTableForReplication(tab_id) にて"rレプリケートしている状態"に戻されます。これが意味するところは、SQL スクリプトの実行の期間にこの slon プロセスによってこれら全てのテーブルにロックが掛けられるという事です。

もしテーブルの列が変更されるとトリガーは再生成されなければならないと言う事は非常に重要で、そうしないとテーブルスキーマの新規形式に対して不適当なものとなります。

これは schemadocddlscript( integer, text, integer ) を使用します。

EXECUTE SCRIPT (
   SET ID = 1,
   FILENAME = '/tmp/changes_2004-05-01.sql',
   EVENT NODE = 1
);