ジュゼッペブロッコロ著
PostgreSQL 9.3以降、ビューが1つの基になるテーブルのみを参照している限り、ビューを直接更新して挿入することができます。
PostgreSQL 9.4では、更新可能なビューへのINSERTにCHECK句を使用できます。たとえば、1つの整数列だけで構成されるテーブルについて考えてみます。 2つのビューを検討します。1つは2で割り切れる数で、もう1つは3で割り切れる数です。最初のビューに123という数を挿入しようとすると、次のようになります。
-
$ CREATE TABLE some_data(id int4 PRIMARY KEY);
テーブルの作成
$ CREATE VIEW first AS SELECT * FROM some_data WHERE 0 =id%2;
ビューの作成
$ CREATE VIEW second AS SELECT * FROM some_data WHERE 0 =id%3;
ビューの作成
$ INSERT INTO first(id)VALUES(123);
-
ビューは2で割り切れる数値のみですが、基になるテーブルに挿入されます(したがって、新しい値はビューに表示されません)。 PostgreSQL 9.4では、値がビューの定義と互換性があることを事前にチェックすることにより、ビューへのINSERTを適切に管理するためのCHECK句が導入されました。
2つの可能なオプションがあります:
*カスケードチェック–これはデフォルトのオプションであり、チェックは同じ基になるテーブルで定義された他のビューにカスケードされます
*ローカルチェック–INSERTのターゲットであるビューのみがチェックされます
ここでは、上記の例でCHECK句を使用する方法を示します。
-
$最初にビューをドロップします;
ドロップビュー
$ DROP VIEW second;
ドロップビュー
$ CREATE VIEW first AS SELECT * FROM some_data WHERE 0 =id%2 WITH CHECK OPTION;
ビューの作成
$ CREATE VIEW second AS SELECT * FROM some_data WHERE 0 =id%3 WITH CHECK OPTION;
ビューの作成
$ CREATE VIEW third AS SELECT * FROM first WHERE 0 =id%3 WITH CHECK OPTION;
ビューの作成
$ INSERT INTO first(id)VALUES(14);
INSERT 0 1
$ INSERT INTO first(id)VALUES(15);
エラー:新しい行が「最初の」ビューのWITHCHECKOPTIONに違反しています
$ INSERT INTO second(id)VALUES(15);
INSERT 0 1
$ INSERT INTO third(id)VALUES(6);
INSERT 0 1
$ INSERT INTO third(id)VALUES(15);
エラー:新しい行が「最初の」ビューのWITHCHECKOPTIONに違反しています
ビュー「3番目」はビュー「最初」で定義されていることに注意してください。
値「14」は最初のビューに正しく挿入されますが、値「15」は、予想どおり、最初ではなく2番目にのみ挿入できます。 3と2の両方で割り切れるので、3番目のビューに「6」を挿入できます。3で割り切れるのに「15」を3番目のビューに挿入する際のエラーは、2で割り切れるCHECK句に違反しているためです。最初に、親ビューで。この場合、問題を回避するには、両方のビューでLOCALCHECK句を使用するだけでは不十分です。
-
$最初にビューをドロップします;
ドロップビュー
$ DROPVIEW3番目;
ドロップビュー
$ CREATE VIEW first AS SELECT * FROM some_data WHERE 0 =id%2 WITH LOCAL CHECK OPTION;
ビューの作成
$ CREATE VIEW third AS SELECT * FROM first WHERE 0 =id%3 WITH LOCAL CHECK OPTION;
ビューの作成
$ INSERT INTO third(id)VALUES(15);
エラー:新しい行が「最初の」ビューのWITHCHECKOPTIONに違反しています
-
実例を次に示します:
-
$最初にビューをドロップします;
ドロップビュー
$ DROPVIEW3番目;
ドロップビュー
$ CREATE VIEW first AS SELECT * FROM some_data WHERE 0 =id%2;
ビューの作成
$ CREATE VIEW third AS SELECT * FROM first WHERE 0 =id%3 WITH LOCAL CHECK OPTION;
ビューの作成
$ INSERT INTO third(id)VALUES(15);
INSERT 0 1
-
結論
この新しいチェックメカニズムは、INSERTフェーズ中に更新可能なビューに直接適用できます。これにより、データの整合性を維持する上でのデータベースの役割がますます強化されます。