DML and DDL replication and nonreplication
==========================================

SQLステートメントの2つのメジャークラスは、 DML とDDLです。

-  DMLはデータ変更言語であり、テーブルに格納されているデータを変更するSQLステートメントに関係します。これには、
   UPDATE、DELETE、およびINSERTが含まれます。

-  DDLはデータ定義言語であり、データの保存方法を変更するSQLステートメントに関係します。これには、
   CREATE、ALTER、およびDROPが含まれます。

PGDは、各クラスを個別に処理します。

DMLレプリケーション
-------------------

PGDはDMLステートメントをレプリケートしません。
DMLステートメントによって発生した変更をレプリケートします。たとえば、2つの行を変更したUPDATEは2つの変更をレプリケートしますが、行を削除しなかったDELETEは何もレプリケートしません。これは、
volatileステートメントの実行結果がレプリケートされ、ステートメントベースのレプリケーションで発生する可能性のあるノード間の相違がないことを意味します。

DDLレプリケーション
-------------------

DDLレプリケーションはDMLとは異なります。
DDLの場合、PGDはステートメントをレプリケートし、すべてのノードで実行します。したがって、
``DROP TABLE IF EXISTS``
はローカルノードで何もレプリケートしない場合がありますが、
DDLレプリケーションが有効になっている場合、ステートメントは他のノードに送信されて実行されます。詳細については、
 :ref:`DDL replication filtering <DDL replication filtering>` を参照してください。

PGDは、同じトランザクション内でも、混合されたDMLおよびDDLステートメントが正しく動作するように機能します。

レプリケートされていないステートメント
--------------------------------------

これらの2つのクラスの外部には、PGDがデザインでレプリケートしないSQLコマンドがあります。次のユーザーコマンドはPGDによってレプリケートされないため、その効果はローカル/オリジンノードでのみ発生します。

-  カーソル操作 DECLARE、CLOSE、FETCH

-  実行コマンド DO、CALL、PREPARE、EXECUTE、EXPLAIN

-  セッション管理 DEALLOCATE、DISCARD、LOAD

-  パラメーターコマンドSET、SHOW

・コンストレイン操作SET CONSTRAINTS

-  ロックコマンド LOCK

-  テーブルメンテナンスコマンド VACUUM、ANALYZE、CLUSTER、REINDEX

-  非同期操作 NOTIFY、LISTEN、UNLISTEN

``NOTIFY`` SQLコマンドと\ ``pg_notify()``
ファンクションはレプリケートされないため、フェイルオーバーの場合の通知は信頼できません。これは、サーバーがクラッシュしたときにトランザクションがコミットされた場合、フェールオーバー時に通知が簡単に失われる可能性があることを意味します。
``LISTEN``
を実行しているアプリケーションは、フェイルオーバーが発生した場合の通知を見逃す場合があります。

これは標準のPostgreSQLレプリケーションに当てはまりますが、
PGDはこれをまだ改善していません。

CAMOおよびEager Replicationオプションでは、 ``NOTIFY``
SQLコマンドまたは\ ``pg_notify()`` ファンクションは使用できません。
