ALTER DOMAIN — ドメイン定義を変更する
ALTER DOMAINname
{ SET DEFAULTexpression
| DROP DEFAULT } ALTER DOMAINname
{ SET | DROP } NOT NULL ALTER DOMAINname
ADDdomain_constraint
[ NOT VALID ] ALTER DOMAINname
DROP CONSTRAINT [ IF EXISTS ]constraint_name
[ RESTRICT | CASCADE ] ALTER DOMAINname
RENAME CONSTRAINTconstraint_name
TOnew_constraint_name
ALTER DOMAINname
VALIDATE CONSTRAINTconstraint_name
ALTER DOMAINname
OWNER TO {new_owner
| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER DOMAINname
RENAME TOnew_name
ALTER DOMAINname
SET SCHEMAnew_schema
ALTER DOMAIN
は既存ドメインの定義を変更します。
以下に示す副構文があります。
SET
/DROP DEFAULT
この構文はドメインのデフォルト値の設定または削除を行います。
指定したデフォルト値は、その後のINSERT
コマンドのみに適用されることに注意してください。
そのドメインを使用したテーブルの既存の行には影響を与えません。
SET
/DROP NOT NULL
この構文はドメインがNULL値を持つことができるかどうかを変更します。
SET NOT NULL
を実行できるのは、ドメインを使用する列にNULL値が含まれていない場合のみです。
ADD domain_constraint
[ NOT VALID ]
この構文はCREATE DOMAIN
と同一の構文を使って、ドメインに新しい制約を付与します。
新しい制約がドメインに追加された時、そのドメインを使用するすべての列が新しく追加された制約に対して検査されます。
NOT VALID
オプションを使用して新しい制約を追加することでこれらの検査を抑制することができます。
ALTER DOMAIN ... VALIDATE CONSTRAINT
を使用することで、後で制約を有効にすることができます。
新しく挿入または更新される行については、NOT VALID
と印が付いていたとしても、常にすべての制約が検査されます。
NOT VALID
はCHECK
制約でのみ受け付けられます。
DROP CONSTRAINT [ IF EXISTS ]
この構文はドメイン上の制約を削除します。
IF EXISTS
が指定された場合、制約が存在しなくてもエラーになりません。
この場合は代わりに注意メッセージが発生します。
RENAME CONSTRAINT
この構文はドメイン上の制約名を変更します。
VALIDATE CONSTRAINT
この構文は、以前にNOT VALID
として追加された制約を検証します。
つまり、そのドメイン型のテーブル列の値すべてが指定された制約を満たすかどうかを検証します。
OWNER
この構文はドメインの所有者を指定したユーザに変更します。
RENAME
この構文はドメインの名前を変更します。
SET SCHEMA
この構文はドメインのスキーマを変更します。 ドメインに関連する制約もすべて新しいスキーマに移動します。
ALTER DOMAIN
を使用するにはドメインを所有していなければなりません。
ドメインのスキーマを変更するには、新しいスキーマにおけるCREATE
権限も持たなければなりません。
所有者を変更するには、新しい所有者ロールに対してSET ROLE
ができなければなりません。また、そのロールはドメインのスキーマにおいてCREATE
権限を持たなければなりません。
(この制限により、所有者の変更により、ドメインの削除と再作成でできないことは何もできないようにしています。
しかし、スーパーユーザはすべてのドメインの所有者を変更することができます。)
name
変更対象となる既存のドメインの名前です(スキーマ修飾名も可)。
domain_constraint
ドメイン用の新しいドメイン制約です。
constraint_name
削除または名前を変更する既存の制約名です。
NOT VALID
既存の格納されたデータについて制約の妥当性を検証しません。
CASCADE
その制約に依存するオブジェクトを自動的に削除し、さらにそれらのオブジェクトに依存するすべてのオブジェクトも削除します(5.14参照)。
RESTRICT
依存するオブジェクトがある場合、制約の削除要求を拒否します。 これがデフォルトの動作です。
new_name
ドメインの新しい名前です。
new_constraint_name
制約の新しい名前です。
new_owner
ドメインの新しい所有者となるユーザの名前です。
new_schema
ドメインの新しいスキーマです。
ALTER DOMAIN ADD CONSTRAINT
は、既存の格納されたデータが新しい制約を満たすか検証しようとしますが、この確認は万全なものではありません。このコマンドが新しく挿入または更新されてまだコミットされていないテーブル行を「見る」ことはできないからです。
同時に実行される操作が不正なデータを挿入する危険があり、処理方法がNOT VALID
オプションを使った制約を追加することであるなら、そのコマンドをコミットして、そのコミットよりも前に開始したトランザクションがすべて完了するのを待ってから、制約に違反するデータを探すためにALTER DOMAIN VALIDATE CONSTRAINT
を発行してください。
制約が一度コミットされれば、新しいトランザクションはすべてドメイン型の新しい値に対してその制約を強制していることが保証されますので、この方法は信頼できます。
今のところ、ALTER DOMAIN ADD CONSTRAINT
、ALTER DOMAIN VALIDATE CONSTRAINT
およびALTER DOMAIN SET NOT NULL
は、指定ドメインまたは任意の派生ドメインがデータベース内のいずれかのテーブルのコンテナ型の列(複合型、配列型もしくは範囲型の列)で使用されていた場合、失敗します。
これは将来的には、こうした入れ子になった値に対する新しい制約を検証できるように改良されるべきです。
ドメインにNOT NULL
制約を付与します。
ALTER DOMAIN zipcode SET NOT NULL;
ドメインからNOT NULL
制約を削除します。
ALTER DOMAIN zipcode DROP NOT NULL;
ドメインにCHECK制約を付与します。
ALTER DOMAIN zipcode ADD CONSTRAINT zipchk CHECK (char_length(VALUE) = 5);
ドメインからCHECK制約を削除します。
ALTER DOMAIN zipcode DROP CONSTRAINT zipchk;
ドメイン上の検査制約の名前を変更します。
ALTER DOMAIN zipcode RENAME CONSTRAINT zipchk TO zip_check;
ドメインを新しいスキーマに移動します。
ALTER DOMAIN zipcode SET SCHEMA customers;
ALTER DOMAIN
文は標準SQLに準拠しています。
ただし、OWNER
、RENAME
、SET SCHEMA
、VALIDATE CONSTRAINT
構文は例外で、PostgreSQLの拡張です。
ADD CONSTRAINT
構文のNOT VALID
句もPostgreSQLの拡張です。