- 締切済み
マテリアライズド・ビューの再計算について
こんにちは ORACLE のマテビューについて困っています。 マテビューを作成して元となるテーブルを削除し再び作成してデーターを投入した後 マテビューを参照するとテーブルを削除する前の情報が表示されてリフレッシュされません どのようにしたら再作成後に投入したデーターをマテビューで表示させる事ができますでしょうか 【検証】 ◆テーブルの作成 CREATE TABLE TEST_TBL (A CHAR(2), B CHAR(5)); ◆レコードを追加 INSERT INTO TEST_TBL VALUES('01','AAA'); INSERT INTO TEST_TBL VALUES('02','BBB'); INSERT INTO TEST_TBL VALUES('03','CCC'); COMMIT; ◆マテビューの作成 CREATE MATERIALIZED VIEW MV_TEST_TBL REFRESH COMPLETE ON COMMIT AS SELECT * FROM TEST_TBL; ◆マテビューの確認 #1 SELECT * FROM MV_TEST_TBL; 3件表示される (正常) ◆レコードの追加 INSERT INTO TEST_TBL VALUES('04','DDD'); COMMIT; ◆マテビューの確認 #2 SELECT * FROM MV_TEST_TBL; 4件表示される (正常) ◆テーブルの削除 DROP TABLE TEST_TBL CASCADE CONSTRAINTS; ◆テーブルの作成 CREATE TABLE TEST_TBL (A CHAR(2), B CHAR(5)); ◆マテビューの確認 #3 SELECT * FROM MV_TEST_TBL; 4件表示される (期待としては 0件であったが) ※疑問1 テーブルのDROP & CREATE は再計算のトリガーに ならないのか? ◆レコードの追加 INSERT INTO TEST_TBL VALUES('05','DDD'); COMMIT; ◆マテビューの確認 #4 SELECT * FROM MV_TEST_TBL; 4件表示される ※期待としては1件だけが表示されてほしかったが 使い方としてはマテビューではなくても普通のビューでもいいのでは と思われるかもしれませんが、元となるテーブルのDROP & CREATE が システム的に発生しますがその際にビューの再作成をしたくないので マテビューを選択しました。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- jamshid6
- ベストアンサー率88% (591/669)
そういう使い方はしたことないですが、依存したテーブルをDROPした瞬間にマテリアライズドビューが無効になるからだと思います。 ALL_MVIEWSのCOMPILE_STATEとSTALENESSを見てもらうとわかりますが、ステータスはともに「NEED_COMPILE」になります。 こうなるとテーブルを再作成しても自動コンパイルはかかりません。 で、ALTER MATERIALIZED VIEW (ビュー) COMPILE;とやると、COMPILE_STATEはVALIDになりますが、STALENESSはUNUSABLEに変わります。 そして、UNUSABLEになったマテリアライズドビューは、完全リフレッシュしないといけません。 OTNの、http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19217-02/advmv.htm の「マテリアライズドビューの無効化」もご覧ください。 要はビューの再作成は不要でも、DBMS_MVIEW.REFRESHはしなくてはならないということだと思います。