DDL command handling matrix
===========================

次の表では、許可されるユーティリティまたはDDLコマンド、レプリケートされるもの、およびレプリケート時に使用されるグローバルロックの種類について説明します。

``ALTER TABLE``
のようなより複雑なステートメントの場合、これらは実行されるサブコマンドによって異なる場合があります。このようなすべてのコマンドには、次の表の下に詳細な説明があります。

コマンドマトリックス
--------------------

.. csv-table::
  :header: Command,Allowed,Replicated,Lock
  :widths: 15,12,12,20
  :align: left
  :class: longtable

  ALTER AGGREGATE,Y,Y,DDL
  ALTER CAST,Y,Y,DDL
  ALTER COLLATION,Y,Y,DDL
  ALTER CONVERSION,Y,Y,DDL
  ALTER DATABASE,Y,N,N
  ALTER DATABASE LINK,Y,Y,DDL
  ALTER DEFAULT PRIVILEGES,Y,Y,DDL
  ALTER DIRECTORY,Y,Y,DDL
  ALTER DOMAIN,Y,Y,DDL
  ALTER EVENT TRIGGER,Y,Y,DDL
  ALTER EXTENSION,Y,Y,DDL
  ALTER FOREIGN DATA WRAPPER,Y,Y,DDL
  ALTER FOREIGN TABLE,Y,Y,DDL
  ALTER FUNCTION,Y,Y,DDL
  ALTER INDEX,Y,Y,DDL
  ALTER LANGUAGE,Y,Y,DDL
  ALTER LARGE OBJECT,N,N,N
  ALTER MATERIALIZED VIEW,Y,:ref:`レプリケーションまたはHA機能を提供する拡張機能<レプリケーションまたはHA機能を提供する拡張機能>` ,DML
  ALTER OPERATOR,Y,Y,DDL
  ALTER OPERATOR CLASS,Y,Y,DDL
  ALTER OPERATOR FAMILY,Y,Y,DDL
  ALTER PACKAGE,Y,Y,DDL
  ALTER POLICY,Y,Y,DDL
  ALTER PROCEDURE,Y,Y,DDL
  ALTER PROFILE,Y,Y,:ref:`DDL locking details<DDL locking details>` 
  ALTER PUBLICATION,Y,Y,DDL
  ALTER QUEUE,Y,Y,DDL
  ALTER QUEUE TABLE,Y,Y,DDL
  ALTER REDACTION POLICY,Y,Y,DDL
  ALTER RESOURCE GROUP,Y,N,N
  ALTER ROLE,Y,Y,DDL
  ALTER ROUTINE,Y,Y,DDL
  ALTER RULE,Y,Y,DDL
  ALTER SCHEMA,Y,Y,DDL
  ALTER SEQUENCE,:ref:`DDL locking details<DDL locking details>` ,Y,DML
  ALTER SERVER,Y,Y,DDL
  ALTER SESSION,Y,N,N
  ALTER STATISTICS,Y,Y,DDL
  ALTER SUBSCRIPTION,Y,Y,DDL
  ALTER SYNONYM,Y,Y,DDL
  ALTER SYSTEM,Y,N,N
  ALTER TABLE,:ref:`DDL locking details<DDL locking details>` ,Y,:ref:`DDL locking details<DDL locking details>` 
  ALTER TABLESPACE,Y,Y,DDL
  ALTER TEXT SEARCH CONFIGURATION,Y,Y,DDL
  ALTER TEXT SEARCH DICTIONARY,Y,Y,DDL
  ALTER TEXT SEARCH PARSER,Y,Y,DDL
  ALTER TEXT SEARCH TEMPLATE,Y,Y,DDL
  ALTER TRIGGER,Y,Y,DDL
  ALTER TYPE,Y,Y,DDL
  ALTER USER MAPPING,Y,Y,DDL
  ALTER VIEW,Y,Y,DDL
  ANALYZE,Y,N,N
  BEGIN,Y,N,N
  CHECKPOINT,Y,N,N
  CLOSE,Y,N,N
  CLOSE CURSOR,Y,N,N
  CLOSE CURSOR ALL,Y,N,N
  CLUSTER,Y,N,DML
  COMMENT,Y,:ref:`DDL locking details<DDL locking details>` ,DDL
  COMMIT,Y,N,N
  COMMIT PREPARED,Y,N,N
  COPY,Y,N,N
  COPY FROM,Y,N,N
  CREATE ACCESS METHOD,Y,Y,DDL
  CREATE AGGREGATE,Y,Y,DDL
  CREATE CAST,Y,Y,DDL
  CREATE COLLATION,Y,Y,DDL
  CREATE CONSTRAINT,Y,Y,DDL
  CREATE CONVERSION,Y,Y,DDL
  CREATE DATABASE,Y,N,N
  CREATE DATABASE LINK,Y,Y,DDL
  CREATE DIRECTORY,Y,Y,DDL
  CREATE DOMAIN,Y,Y,DDL
  CREATE EVENT TRIGGER,Y,Y,DDL
  CREATE EXTENSION,Y,Y,DDL
  CREATE FOREIGN DATA WRAPPER,Y,Y,DDL
  CREATE FOREIGN TABLE,Y,Y,DDL
  CREATE FUNCTION,Y,Y,DDL
  CREATE INDEX,Y,Y,DML
  CREATE LANGUAGE,Y,Y,DDL
  CREATE MATERIALIZED VIEW,Y,:ref:`レプリケーションまたはHA機能を提供する拡張機能<レプリケーションまたはHA機能を提供する拡張機能>` ,DML
  CREATE OPERATOR,Y,Y,DDL
  CREATE OPERATOR CLASS,Y,Y,DDL
  CREATE OPERATOR FAMILY,Y,Y,DDL
  CREATE PACKAGE,Y,Y,DDL
  CREATE PACKAGE BODY,Y,Y,DDL
  CREATE POLICY,Y,Y,DML
  CREATE PROCEDURE,Y,Y,DDL
  CREATE PROFILE,Y,Y,:ref:`DDL locking details<DDL locking details>` 
  CREATE PUBLICATION,Y,Y,DDL
  CREATE QUEUE,Y,Y,DDL
  CREATE QUEUE TABLE,Y,Y,DDL
  CREATE REDACTION POLICY,Y,Y,DDL
  CREATE RESOURCE GROUP,Y,N,N
  CREATE ROLE,Y,Y,DDL
  CREATE ROUTINE,Y,Y,DDL
  CREATE RULE,Y,Y,DDL
  CREATE SCHEMA,Y,Y,DDL
  CREATE SEQUENCE,:ref:`DDL locking details<DDL locking details>` ,Y,DDL
  CREATE SERVER,Y,Y,DDL
  CREATE STATISTICS,Y,Y,DDL
  CREATE SUBSCRIPTION,Y,Y,DDL
  CREATE SYNONYM,Y,Y,DDL
  CREATE TABLE,Y,Y,DDL
  CREATE TABLE AS,:ref:`DDL locking details<DDL locking details>` ,Y,DDL
  CREATE TABLESPACE,Y,Y,DDL
  CREATE TEXT SEARCH CONFIGURATION,Y,Y,DDL
  CREATE TEXT SEARCH DICTIONARY,Y,Y,DDL
  CREATE TEXT SEARCH PARSER,Y,Y,DDL
  CREATE TEXT SEARCH TEMPLATE,Y,Y,DDL
  CREATE TRANSFORM,Y,Y,DDL
  CREATE TRIGGER,Y,Y,DDL
  CREATE TYPE,Y,Y,DDL
  CREATE TYPE BODY,Y,Y,DDL
  CREATE USER MAPPING,Y,Y,DDL
  CREATE VIEW,Y,Y,DDL
  DEALLOCATE,Y,N,N
  DEALLOCATE ALL,Y,N,N
  DECLARE CURSOR,Y,N,N
  DISCARD,Y,N,N
  DISCARD ALL,Y,N,N
  DISCARD PLANS,Y,N,N
  DISCARD SEQUENCES,Y,N,N
  DISCARD TEMP,Y,N,N
  DO,Y,N,N
  DROP ACCESS METHOD,Y,Y,DDL
  DROP AGGREGATE,Y,Y,DDL
  DROP CAST,Y,Y,DDL
  DROP COLLATION,Y,Y,DDL
  DROP CONSTRAINT,Y,Y,DDL
  DROP CONVERSION,Y,Y,DDL
  DROP DATABASE,Y,N,N
  DROP DATABASE LINK,Y,Y,DDL
  DROP DIRECTORY,Y,Y,DDL
  DROP DOMAIN,Y,Y,DDL
  DROP EVENT TRIGGER,Y,Y,DDL
  DROP EXTENSION,Y,Y,DDL
  DROP FOREIGN DATA WRAPPER,Y,Y,DDL
  DROP FOREIGN TABLE,Y,Y,DDL
  DROP FUNCTION,Y,Y,DDL
  DROP INDEX,Y,Y,DDL
  DROP LANGUAGE,Y,Y,DDL
  DROP MATERIALIZED VIEW,Y,:ref:`レプリケーションまたはHA機能を提供する拡張機能<レプリケーションまたはHA機能を提供する拡張機能>` ,DML
  DROP OPERATOR,Y,Y,DDL
  DROP OPERATOR CLASS,Y,Y,DDL
  DROP OPERATOR FAMILY,Y,Y,DDL
  DROP OWNED,Y,Y,DDL
  DROP PACKAGE,Y,Y,DDL
  DROP PACKAGE BODY,Y,Y,DDL
  DROP POLICY,Y,Y,DDL
  DROP PROCEDURE,Y,Y,DDL
  DROP PROFILE,Y,Y,DDL
  DROP PUBLICATION,Y,Y,DDL
  DROP QUEUE,Y,Y,DDL
  DROP QUEUE TABLE,Y,Y,DDL
  DROP REDACTION POLICY,Y,Y,DDL
  DROP RESOURCE GROUP,Y,N,N
  DROP ROLE,Y,Y,DDL
  DROP ROUTINE,Y,Y,DDL
  DROP RULE,Y,Y,DDL
  DROP SCHEMA,Y,Y,DDL
  DROP SEQUENCE,Y,Y,DDL
  DROP SERVER,Y,Y,DDL
  DROP STATISTICS,Y,Y,DDL
  DROP SUBSCRIPTION,Y,Y,DDL
  DROP SYNONYM,Y,Y,DDL
  DROP TABLE,Y,Y,DML
  DROP TABLESPACE,Y,Y,DDL
  DROP TEXT SEARCH CONFIGURATION,Y,Y,DDL
  DROP TEXT SEARCH DICTIONARY,Y,Y,DDL
  DROP TEXT SEARCH PARSER,Y,Y,DDL
  DROP TEXT SEARCH TEMPLATE,Y,Y,DDL
  DROP TRANSFORM,Y,Y,DDL
  DROP TRIGGER,Y,Y,DDL
  DROP TYPE,Y,Y,DDL
  DROP TYPE BODY,Y,Y,DDL
  DROP USER MAPPING,Y,Y,DDL
  DROP VIEW,Y,Y,DDL
  EXECUTE,Y,N,N
  EXPLAIN,Y,:ref:`DDL locking details<DDL locking details>` ,:ref:`DDL locking details<DDL locking details>` 
  FETCH,Y,N,N
  GRANT,Y,:ref:`DDL locking details<DDL locking details>` ,DDL
  GRANT ROLE,Y,Y,DDL
  IMPORT FOREIGN SCHEMA,Y,Y,DDL
  LISTEN,Y,N,N
  LOAD,Y,N,N
  LOAD ROW DATA,Y,Y,DDL
  LOCK TABLE,Y,N,:ref:`DDL locking details<DDL locking details>` 
  MOVE,Y,N,N
  NOTIFY,Y,N,N
  PREPARE,Y,N,N
  PREPARE TRANSACTION,Y,N,N
  REASSIGN OWNED,Y,Y,DDL
  REFRESH MATERIALIZED VIEW,Y,:ref:`レプリケーションまたはHA機能を提供する拡張機能<レプリケーションまたはHA機能を提供する拡張機能>` ,DML
  REINDEX,Y,Y,DDL
  RELEASE,Y,N,N
  RESET,Y,N,N
  REVOKE,Y,:ref:`DDL locking details<DDL locking details>` ,DDL
  REVOKE ROLE,Y,Y,DDL
  ROLLBACK,Y,N,N
  ROLLBACK PREPARED,Y,N,N
  SAVEPOINT,Y,N,N
  SECURITY LABEL,Y,:ref:`DDL locking details<DDL locking details>` ,DDL
  SELECT INTO,:ref:`DDL locking details<DDL locking details>` ,Y,DDL
  SET,Y,N,N
  SET CONSTRAINTS,Y,N,N
  SHOW,Y,N,N
  START TRANSACTION,Y,N,N
  TRUNCATE TABLE,Y,:ref:`DDL locking details<DDL locking details>` ,:ref:`DDL locking details<DDL locking details>` 
  UNLISTEN,Y,N,N
  VACUUM,Y,N,N

コマンドに関する注意事項
------------------------

ALTER SEQUENCE
^^^^^^^^^^^^^^

PGD 6.3.0以降、\ ``ALTER SEQUENCE`` が完全にサポートされています。

PGD 6.2.0は、\ ``galloc`` シーケンスに\ ``RENAME``
および\ ``SET SCHEMA``
機能を導入しましたが、この機能は、6.2.0へのアップグレード後に6.2.0より前のPGDバージョンで作成されたシーケンスでは動作しませんでした。失敗の理由は、PGD
6.2.0が\ ``galloc``
シーケンスを追跡するためのグローバルUUID識別子を導入したことです。これはシーケンス作成時に生成されましたが、以前のPGDバージョンで作成されたシーケンスには欠落していました。

PGD 6.3.0では、
BDRマネージャーがシーケンスのUUIDが欠落している場合は生成し、以前のPGDバージョンで作成されたシーケンスの機能を有効にするため、その制限を削除します。

ALTER TABLE
^^^^^^^^^^^

通常、 ``ALTER TABLE``
コマンドは許可されます。ただし、いくつかのサブコマンドはサポートされていません。

ALTER TABLEは許可されないコマンド
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``ALTER TABLE`` の一部のバリアントは、現在PGDノードで使用できません。

- ``ALTER COLUMN ... SET STORAGE external`` -
  列がテーブルのレプリカIDの列の1つである場合、拒否されます。コマンドが安全であることが確認できる場合は、
  ``bdr.permit_unsafe_commands``
  を使用してこの動作をオーバーライドできます。

- ``RENAME`` -
  自動パーティション化されたテーブルの名前は変更できません。

- ``SET SCHEMA`` -
  自動パーティションテーブルのスキーマは設定できません。

- ``ALTER TABLE ... ADD FOREIGN KEY`` -
  現在のユーザーが参照されるテーブルを読み取る権限がない場合、または参照されるテーブルで現在のユーザーがバイパスできないRLS制限が有効になっている場合、サポートされません。

次の例は、 ``timestamp`` 型の定数値を\ ``timestamptz``
型の列に追加しようとするため、失敗します。 ``timestamp``
と\ ``timestamptz``
間のキャストは、セッションのタイムゾーンに依存するため、不変ではありません。

.. code:: sql

   ALTER TABLE foo
     ADD expiry_date timestamptz DEFAULT timestamp 2100-01-01 00:00:00 NOT NULL;

DMLロックを取得せずに、 ``CHECK`` や\ ``FOREIGN KEY``
制約などの特定のタイプの制約を追加できます。ただし、これには、最初に\ ``NOT VALID``
制約を作成し、次に ``ALTER TABLE ... VALIDATE CONSTRAINT``
コマンドを使用して別のトランザクションで制約を検証する2段階のプロセスが必要です。
:ref:`コンストレインの追加 <コンストレインの追加>` を参照

詳細については、

ALTER TABLE ロック
^^^^^^^^^^^^^^^^^^

``ALTER TABLE`` の次のバリアントは、
DDLロックのみを取得し、DMLロックは取得しません。

- ``ALTER TABLE ... ADD COLUMN ... (immutable) DEFAULT``

- ``ALTER TABLE ... ALTER COLUMN ... SET DEFAULT expression``

- ``ALTER TABLE ... ALTER COLUMN ... DROP DEFAULT``

- ``ALTER TABLE ... ALTER COLUMN ... TYPE`` リライトが必要ない場合

- ``ALTER TABLE ... ALTER COLUMN ... SET STATISTICS``

- ``ALTER TABLE ... VALIDATE CONSTRAINT``

- ``ALTER TABLE ... ATTACH PARTITION``

- ``ALTER TABLE ... DETACH PARTITION``

- ``ALTER TABLE ... ENABLE TRIGGER`` ``ENABLE REPLICA TRIGGER``
  は引き続きDMLロックを取得します

- ``ALTER TABLE ... CLUSTER ON``

- ``ALTER TABLE ... SET WITHOUT CLUSTER``

- ``ALTER TABLE ... SET ( storage_parameter = value [, ... ] )``

- ``ALTER TABLE ... RESET ( storage_parameter = [, ... ] )``

- ``ALTER TABLE ... OWNER TO``

``ALTER TABLE``
の他のすべてのバリアントは、変更されるテーブルでDMLロックを取得します。
``ALTER TABLE`` の一部のバリアントには、以下に説明する制限があります。

ALTER TABLEの例
^^^^^^^^^^^^^^^

さまざまなタイプの\ ``ALTER TABLE ... ALTER COLUMN TYPE``
ATCT操作が可能です。一部のATCT操作は、基になる列タイプのメタデータのみを更新し、基になるテーブルデータの書き換えは必要ありません。これは通常、既存の列タイプとターゲットタイプがバイナリ強制可能な場合に当てはまります。

.. code:: sql

   CREATE TABLE foo (id BIGINT PRIMARY KEY, description VARCHAR(20));
   ALTER TABLE foo ALTER COLUMN description TYPE VARCHAR(128);

ただし、VARCHAR(128)からVARCHAR(20)に変更されたコマンドを元に戻すためにこの変更を行うことは、バイナリ強制不可であり、テーブルの書き換えが発生します。

.. code:: sql

   CREATE TABLE sample (col1 BIGINT PRIMARY KEY, col2 VARCHAR(128), col3 INT);
   ALTER TABLE sample ALTER COLUMN col2 TYPE VARCHAR(256);

バイナリの強制性のため、列タイプをVARCHARまたはTEXTデータ型に変更することもできます。繰り返しますが、これは基になる列タイプの単なるメタデータの更新です。

.. code:: sql

   ALTER TABLE sample ALTER COLUMN col2 TYPE VARCHAR;
   ALTER TABLE sample ALTER COLUMN col2 TYPE TEXT;

TABLE REWRITEの例
'''''''''''''''''

ユーザーは列のデータ型を変更したり、ヌル以外のデフォルトで列を追加したり、メンテナンスジョブを実行したりする場合があります。これらの操作は、テーブルの書き換えをトリガーする可能性があるPostgreSQLのDDLコマンドでサポートされています。テーブル書き換え操作には、ディスク上にテーブルの新しいバージョンの作成が含まれます。
``CLUSTER`` や\ ``VACUUM``
などのDDL操作は、テーブル定義を変更せずにテーブルの書き換えを直接発生させます。
``ALTER TABLE…ALTER COLUMN TYPE``
のようなDDL操作は、列を変更し、テーブルの書き換えをトリガーする場合があります。既存のすべてのデータを古いバージョンから新しいものにコピーし、新しいバージョンの準備ができて一貫性があると、古いテーブルを新しいものに置き換えます。

典型的なテーブル書き換えATCT操作の例

次のテーブルを検討します。

.. code:: sql

   CREATE TABLE foo(
       c1 int,
       c2 int,
       c3 int,
       name text,
       time_now timestamptz,
       dollar numeric,
       indian_currency int GENERATED ALWAYS AS (dollar * 90.50) STORED
   );

そのテーブルを指定すると、次のALTER
TABLEコマンドはテーブルの書き換えをトリガーします。

列のデータ型を変更します。

.. code:: sql

   ALTER TABLE foo ALTER c1 TYPE bigint;

USING句を使用して列タイプを互換性のないタイプに変更します。

.. code:: sql

   ALTER TABLE foo ALTER COLUMN name TYPE int USING name::integer;

揮発性列タイプ

.. code:: sql

   ALTER TABLE foo ALTER COLUMN time_now TYPE timestamp;

変更可能なデフォルトを使用して列を追加します。

.. code:: sql

   ALTER TABLE foo ADD COLUMN time_clock timestamptz NOT NULL DEFAULT clock_timestamp();

生成された列

.. code:: sql

   ALTER TABLE foo ALTER COLUMN indian_currency TYPE numeric;

単一のトランザクションブロックで複数の\ ``ALTER TABLE``
DDL操作を実行します。

.. code:: sql

   BEGIN;
   ALTER TABLE foo ALTER c2 TYPE bigint;
   ALTER TABLE foo ALTER c3 TYPE bigint;
   COMMIT;

PGDクラスターでは、これには書き換えが含まれるため、書き換えアクティビティはDMLタイプのグローバルリーダーロックを取得し、したがって、クラスター内のすべてのグループリーダーが利用できる必要があります。

..  Note::
   提供されている`ALTER TABLE` の例は、使用可能なATCT操作の完全なリストではありません。

ALTER TYPE
^^^^^^^^^^

``ALTER TYPE`` はレプリケートされますが、
PostgreSQLはこれらの依存関係を記録しないため、グローバルDMLロックはそのデータ型を使用するすべてのテーブルに適用されません。
:ref:`Workarounds for DDL restrictions <Workarounds for DDL restrictions>` を参照してください。

コメントオン
^^^^^^^^^^^^

``COMMENT ON`` のすべてのバリアントが許可されますが、
``COMMENT ON TABLESPACE/DATABASE/LARGE OBJECT``
はレプリケートされません。

CREATE PROFILEまたはALTER PROFILE
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

ファンクションが\ ``SECURITY DEFINER``
の場合、プロファイルに関連付けられている\ ``PASSWORD_VERIFY_FUNCTION``
は\ ``IMMUTABLE`` である必要があります。このような\ ``CREATE PROFILE``
または\ ``ALTER PROFILE``
コマンドはレプリケートされますが、このプロファイルを使用する後続の\ ``CREATE USER``
または\ ``ALTER USER`` コマンドは、 ``writer``
ワーカーが\ ``cannot change current role within security-restricted operation``
エラーをスローするため、レプリケーションを中断します。

..  Note::
   データベースオブジェクトはこれらのサーバーにレプリケートされないため、PGDは監視サーバーで`PASSWORD_VERIFY_FUNCTION` を実行しません。オリジンノードは既にファンクションを実行し、パスワードを検証しているため、witnessの重複チェックは冗長です。

とにかくウィットネス サーバで\ ``PASSWORD_VERIFY_FUNCTION``
を実行するには、そこでファンクションを手動で作成し、ウィットネス
サーバで\ ``CREATE PROFILE`` または\ ``ALTER PROFILE``
を直接実行します。

.. ::
   ### CREATE SEQUENCE

一般に\ ``CREATE SEQUENCE``
がサポートされていますが、グローバルシーケンスを使用する場合、一部のオプションは効果がありません。

CREATE TABLE ASとSELECT INTO
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``CREATE TABLE AS`` および\ ``SELECT INTO``
は、すべてのサブコマンドも許可される場合にのみ許可されます。

EXPLAIN
^^^^^^^

一般に\ ``EXPLAIN`` は許可されますが、 ``EXPLAIN ANALYZE``
はデータベースに副作用を与える可能性があるため、いくつかの制限があります。

EXPLAIN ANALYZEレプリケーション
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``EXPLAIN ANALYZE``
は、分析されたステートメントのレプリケーションルールに従います。

EXPLAIN ANALYZEロック
^^^^^^^^^^^^^^^^^^^^^

``EXPLAIN ANALYZE``
は、分析されたステートメントのロックルールに従います。

GRANTとREVOKE
^^^^^^^^^^^^^

通常、\ ``GRANT`` および\ ``REVOKE``
ステートメントはサポートされていますが、
``GRANT/REVOKE ON TABLESPACE/LARGE OBJECT`` はレプリケートされません。

ロックテーブル
^^^^^^^^^^^^^^

LOCK TABLEはレプリケートされませんが、 ``bdr.lock_table_locking``
が\ ``on``
に設定されている場合、グローバルDMLロックを取得する場合があります。

``bdr.global_lock_table()``
ファンクションを使用して、グローバルDMLロックを明示的に要求することもできます。

マテリアライズドビュー
^^^^^^^^^^^^^^^^^^^^^^

``CREATE MATERIALIZED VIEW``
は、上流ノードにのみデータを入力します。データは複製されます。
``REFRESH MATERIALIZED VIEW``
も上流ノードでのみ実行されます。結果は下流ノードに複製されます。

マテリアライズドビューレプリケーションは、BDRPG、EDB Advanced Server
、または2QPGでのみ利用できます。
PGDのコミュニティPostgresビルドは、4つのコマンドすべてを非レプリケートとして扱います。

セキュリティラベル
^^^^^^^^^^^^^^^^^^

``SECURITY LABEL`` のすべてのバリアントが許可されますが、
``SECURITY LABEL ON TABLESPACE/DATABASE/LARGE OBJECT``
はレプリケートされません。

TRUNCATEレプリケーション
^^^^^^^^^^^^^^^^^^^^^^^^

``TRUNCATE`` コマンドは、
DDLステートメントではなくDMLとしてレプリケートされます。テーブルの\ ``TRUNCATE``
がレプリケートされるかどうかは、影響を受ける各テーブルのレプリケーション設定によって異なります。

TRUNCATEロック
^^^^^^^^^^^^^^

``TRUNCATE`` は他のDDLと同じ方法でレプリケートされませんが、
``bdr.truncate_locking`` が\ ``on``
に設定されている場合、グローバルDMLロックを取得できます。
