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 |
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 |
DML |
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 |
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 |
|
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 |
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 |
||
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 |
DML |
|
REINDEX |
Y |
Y |
DDL |
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#
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
間のキャストは、セッションのタイムゾーンに依存するため、不変ではありません。
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) DEFAULTALTER TABLE ... ALTER COLUMN ... SET DEFAULT expressionALTER TABLE ... ALTER COLUMN ... DROP DEFAULTALTER TABLE ... ALTER COLUMN ... TYPEリライトが必要ない場合ALTER TABLE ... ALTER COLUMN ... SET STATISTICSALTER TABLE ... VALIDATE CONSTRAINTALTER TABLE ... ATTACH PARTITIONALTER TABLE ... DETACH PARTITIONALTER TABLE ... ENABLE TRIGGERENABLE REPLICA TRIGGERは引き続きDMLロックを取得しますALTER TABLE ... CLUSTER ONALTER TABLE ... SET WITHOUT CLUSTERALTER 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#
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
エラーをスローするため、レプリケーションを中断します。
注釈
データベースオブジェクトはこれらのサーバーにレプリケートされないため、PGDは監視サーバーで`PASSWORD_VERIFY_FUNCTION` を実行しません。オリジンノードは既にファンクションを実行し、パスワードを検証しているため、witnessの重複チェックは冗長です。
とにかくウィットネス サーバでPASSWORD_VERIFY_FUNCTION
を実行するには、そこでファンクションを手動で作成し、ウィットネス
サーバでCREATE PROFILE またはALTER PROFILE
を直接実行します。
一般に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ロックを取得できます。