DDL command handling matrix#

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

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

コマンドマトリックス#

Command

Allowed

Replicated

Lock

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

Y

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

アーキテクチャの詳細

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

アーキテクチャの詳細

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

アーキテクチャの詳細

Y

アーキテクチャの詳細

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

N

COMMENT

Y

アーキテクチャの詳細

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

Y

DDL

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

アーキテクチャの詳細

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

アーキテクチャの詳細

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

アーキテクチャの詳細

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

Y

DDL

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

アーキテクチャの詳細

アーキテクチャの詳細

FETCH

Y

N

N

GRANT

Y

アーキテクチャの詳細

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

アーキテクチャの詳細

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

Y

DML

REINDEX

Y

N

N

RELEASE

Y

N

N

RESET

Y

N

N

REVOKE

Y

アーキテクチャの詳細

DDL

REVOKE ROLE

Y

Y

DDL

ROLLBACK

Y

N

N

ROLLBACK PREPARED

Y

N

N

SAVEPOINT

Y

N

N

SECURITY LABEL

Y

アーキテクチャの詳細

DDL

SELECT INTO

アーキテクチャの詳細

Y

DDL

SET

Y

N

N

SET CONSTRAINTS

Y

N

N

SHOW

Y

N

N

START TRANSACTION

Y

N

N

TRUNCATE TABLE

Y

アーキテクチャの詳細

アーキテクチャの詳細

UNLISTEN

Y

N

N

VACUUM

Y

N

N

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

ALTER SEQUENCE#

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

ALTER SEQUENCE ... RENAME は、gallocシーケンスのみでサポートされていません。 ALTER SEQUENCE ... SET SCHEMA は、gallocシーケンスのみでサポートされていません。

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 間のキャストは、セッションのタイムゾーンに依存するため、不変ではありません。

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段階のプロセスが必要です。 コンストレインの追加 を参照

詳細については、

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操作は、基になる列タイプのメタデータのみを更新し、基になるテーブルデータの書き換えは必要ありません。これは通常、既存の列タイプとターゲットタイプがバイナリ強制可能な場合に当てはまります。

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

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

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

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

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操作の例

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

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コマンドはテーブルの書き換えをトリガーします。

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

ALTER TABLE foo ALTER c1 TYPE bigint;

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

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

揮発性列タイプ

ALTER TABLE foo ALTER COLUMN time_now TYPE timestamp;

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

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

生成された列

ALTER TABLE foo ALTER COLUMN indian_currency TYPE numeric;

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

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

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

注釈

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

ALTER TYPE はレプリケートされますが、 PostgreSQLはこれらの依存関係を記録しないため、グローバルDMLロックはそのデータ型を使用するすべてのテーブルに適用されません。 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 エラーをスローするため、レプリケーションを中断します。

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ロックを明示的に要求することもできます。

セキュリティラベル#

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

TRUNCATEレプリケーション#

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

TRUNCATEロック#

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