8

PostegreSQLを少しリラックスさせたいです。ビューで使用されている列を変更するたびに、ビューを削除し、フィールドを変更してから、ビューを再作成する必要があるようです。追加の保護を放棄して、フィールドを変更してからビューの調整を理解するようにPostgreSQLに指示することはできますか?

明確化: 私はビューが何であるかを理解しています。実際、ビューがサブクエリのようなものであるため、基になるテーブルを変更して、ビューに変更を取得させることができればと思います。

私が次のものを持っているとしましょう:

CREATE TABLE monkey
(
  "name" character varying(50) NOT NULL,
)

CREATE OR REPLACE VIEW monkey_names AS 
 SELECT name
   FROM monkey

ビューを削除して再作成せずに、移行スクリプトで次のことを実行したいだけです。

ALTER TABLE monkey ALTER COLUMN "name" character varying(100) NOT NULL
4

1 に答える 1

14

この場合の恒久的な解決策

この問題を完全に回避するには、データ型textまたはvarchar/character varyingの代わりに長さ指定子を使用しcharacter varying(n)ます。マニュアルでこれらのデータ型についてお読みください。

CREATE TABLE monkey(name text NOT NULL)

本当に最大長を適用したい場合は、CHECK制約を作成します。

ALTER TABLE monkey 
  ADD CONSTRAINT monkey_name_len CHECK (length(name) < 101);

ビューなどの依存オブジェクトに触れることなく、またタイプの変更のためにPostgresにテーブルに新しい行を書き込むように強制することなく、いつでもその制約を変更または削除できます(Postgresの最新バージョンでは必ずしも必要ではありません)。

詳細な説明

@Michaelによって提案されたように、私はいくつかのより一般的な情報を追加します:

PostgreSQLのビューは、単なる「サブクエリのエイリアス」ではありません。ビューは、ルールを持つ特別なテーブルとして実装されON SELECT TO my_view DO INSTEADます。(そのため、コマンドを使用してビューを変更できますALTER TABLE。)GRANT特権を付与したり、コメントを追加したり、列のデフォルトを定義したりすることもできます(ルールに役立ちますON INSERT TO my_view DO INSTEAD...)。詳細については、こちらまたはこちらのマニュアルをご覧ください。

基になるオブジェクトを変更する場合は、依存するビューの定義クエリも変更する必要があります。ステートメントは、ビューのALTER VIEW補助属性のみを変更できます。クエリを変更するために使用CREATE OR REPLACE VIEWします-追加の属性を保持します。

ただし、結果の列のデータ型を変更する場合(手元の場合のように)、CREATE OR REPLACE VIEWは不可能です。あなたはDROP古いものとCREATE新しいものを見る必要があります。これにより、基になるテーブルのデータが削除されることはありません。ただし、ビューの追加の属性はすべて削除されますが、これらも再作成する必要があります。

于 2011-12-15T22:56:17.530 に答える