1

これは不可能かもしれませんが、ビューを使用してテーブルをオンラインで置き換える簡単な方法があるかどうかを知りたいと思っていました。

パーティショニングなどのオンライン テーブルの再構築には、DBMS_REDEFINITION が最適です。しかし、テーブルを (具体化された) ビューに置き換えたいので、DBMS_REDEFINITION は不適切なようです。

名前の変更中に心配する制約、依存関係、dml の変更などはありません。テーブルをビューに置き換えるときにのみ、ターゲットを選択可能にしたいと思います。切り詰めた例を以下に示します。

  CREATE TABLE SCI_FI_MOVIE (
  SCI_FI_MOVIE_ID NUMBER(10, 0)        NOT NULL PRIMARY KEY,
  NAME            VARCHAR2(100) UNIQUE NOT NULL,
  DIRECTOR        VARCHAR2(100)        NOT NULL,
  REVIEW_SCORE    NUMBER(1, 0) CHECK ( REVIEW_SCORE IN (1, 2, 3, 4, 5))
);

CREATE TABLE NO_SCORES_SCI_FI_MOVIE (
  SCI_FI_MOVIE_ID NUMBER(10, 0)        NOT NULL PRIMARY KEY,
  NAME            VARCHAR2(100) UNIQUE NOT NULL,
  DIRECTOR        VARCHAR2(100)        NOT NULL
);

CREATE MATERIALIZED VIEW KUBRICK_SABOTAGE
(SCI_FI_MOVIE_ID, NAME, DIRECTOR, REVIEW_SCORE)
REFRESH COMPLETE ON COMMIT
AS
  SELECT
    SCI_FI_MOVIE_ID,
    NAME,
    DIRECTOR,
    CASE WHEN DIRECTOR = 'KUBRICK'
      THEN 5
    ELSE 2 END AS REVIEW_SCORE
  FROM NO_SCORES_SCI_FI_MOVIE;

INSERT INTO SCI_FI_MOVIE VALUES (1, 'Apollo 13', 'HOWARD', 5);
INSERT INTO SCI_FI_MOVIE VALUES (2, '2001: A Space Odyssey', 'KUBRICK', 4);

INSERT INTO NO_SCORES_SCI_FI_MOVIE VALUES (1, 'Apollo 13', 'HOWARD');
INSERT INTO NO_SCORES_SCI_FI_MOVIE VALUES (2, '2001: A Space Odyssey', 'KUBRICK');

COMMIT;

-- THEN WHAT STEPS TO REPLACE TABLE WITH VIEW?

この例では、SCI_FI_MOVIE という名前の MV と、TABLE SCI_FI_MOVIE の名前を SCI_FI_MOVIE_TEMP に変更するか、削除を保留するものにします。元のテーブルを置き換える前に MV が存在する必要はありません。置き換えをアトミックに行うことができる場合です。

オブジェクト名の解決に対する中断や妥協を避けたいです (CREATE PUBLIC SYNONYM元の名前の変更はここでは機能しません)。

これを行うためのクリーンでダウンタイムのない方法はありますか?
必要に応じて、ロギング、読み取り専用などを自由に無効にできます。唯一の目標は、ディクショナリの切り替え中に「ORA-00942: テーブルまたはビューが存在しません」を防止することです。私は 11gR2 を使用していますが、12c ソリューションも歓迎します。

あなたの考えをどうもありがとう

4

1 に答える 1