概要
前回の続きです。
テーマは「スキーマ変更した後、Viewはどうなるか?」です。
DB2 for iでの動作確認
前回同様、実際に「手を動かして試す」ことにしました。
検証用テーブルの準備
今回は「果物テーブル」を作ってみました。
CREATE TABLE TIGERDB.TFRUITS ( ID INT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1 NO CACHE), NAME CHAR(32), PRICE INT, MEMO CHAR(40), MEMO2 CHAR(40), CRT_TS TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, UPD_TS TIMESTAMP NOT NULL, PRIMARY KEY(ID) ) RCDFMT RECFRU --TIGERDB にテーブル TFRUITS が作成されましたが,ジャーナル処理されていません。 INSERT INTO TIGERDB.TFRUITS (NAME, PRICE, MEMO, MEMO2, UPD_TS) VALUES (' バナナ ',298, '', '', '0001-01-01-00.00.00') --TIGERDB の TFRUITS に 1 行が挿入された。 INSERT INTO TIGERDB.TFRUITS (NAME, PRICE, MEMO, MEMO2, UPD_TS) VALUES (' いちご ',545, '', '', '0001-01-01-00.00.00') --TIGERDB の TFRUITS に 1 行が挿入された。 INSERT INTO TIGERDB.TFRUITS (NAME, PRICE, MEMO, MEMO2, UPD_TS) VALUES (' みかん ',380, '', '', '0001-01-01-00.00.00') --TIGERDB の TFRUITS に 1 行が挿入された。
ビューの作成
今回準備したのはテーブル1つだけですので、WHERE文を使ったシンプルなビューにしました。
CREATE VIEW TIGERDB.VFRUITS AS SELECT ID, NAME, PRICE, MEMO, MEMO2 FROM TIGERDB.TFRUITS WHERE PRICE > 300 -- ビュー VFRUITS が TIGERDB に作成された。
問題なく、ビューを利用できましたね。
SELECT * FROM TIGERDB.VFRUITS --ID NAME PRICE MEMO MEMO2 -- 2 いちご 545 -- 3 みかん 380
検証作業
さあ、ここからが本題です。
(1) フィールド削除
ビューが参照しているテーブルの1つのフィールドを削除してみました。
ALTER TABLE TIGERDB.TFRUITS DROP COLUMN MEMO2 --TIGERDB のテーブル TFRUITS に対する ALTER が完了しました。
【JOBLOG Message】 フィールド MEMO2 を変更するとデータが失われます。 (C I) ファイル TFRUITS の変更はデータが失われる原因となることがある。 ? I ライブラリー TIGERDB の従属ファイル VFRUITS が削除された。 ファイル TFRUITS について 1 個の制約が変更された。
すでにJOBLOGの表示でわかるように、削除したフィールドが含むビューも、連動して削除されてしまいましたね。
当然の動きかもしれませんね。挙動がわかればOKです。
(2) フィールド属性変更
今度は属性変更です。
再度ビューを作成してから、1つのフィールドの長さを変更してみました。
-- Viewを再作成 CREATE VIEW TIGERDB.VFRUITS AS SELECT ID, NAME, PRICE, MEMO FROM TIGERDB.TFRUITS WHERE PRICE > 300 -- ビュー VFRUITS が TIGERDB に作成された。 ALTER TABLE TIGERDB.TFRUITS ALTER COLUMN MEMO SET DATA TYPE CHAR(50) --TIGERDB のテーブル TFRUITS に対する ALTER が完了しました。
今度は、ビューが削除されることは無かったです。
スキーマ変更でViewに影響が無ければ、毎回削除されるわけでは無いようです。
まとめ
テーブルに手を加えた場合のビューへの影響を調査してみました。
当たり前のこと過ぎて、大変恐縮なのですが、スキーマ変更後には、DSPDBRコマンドやWRKOBJコマンドなどでビューの存在を確認した方がいいということでしょう。
RPG言語に慣れすぎてしまって、「SQLファースト」へシフトチェンジするのに四苦八苦しているところですが、今回のように検証を積み重ねながら、幅広くテクノロジーを利用し、本来やるべきタスクに集中していこうと思っています。