実用的なアプリケーションのOracleの名前の変更表いったん覚えておいてください

起因

私たちは、本番環境でのテーブル製品上のデータの一部重複を削除します。我々が開始する前に、以下のように、我々はまず、テーブルのバックアップを作成しました。

    CREATE TABLE APP.PRODUCT_201910 TABLESPACE "TABLESPACE_1" nologging AS SELECT * FROM APP.PRODUCT WHERE 1=2;
    INSERT /*+ APPEND PARALLEL(8) */ INTO APP.PRODUCT_201910 nologging SELECT * FROM APP.PRODUCT;
    COMMIT;

なお、CATSを使用して作成します(TABLE ASのCREATE)テーブルの方法、表には、その親の制約、ID列、列のデフォルト値または主キーから継承しません。

完成した後、我々は、製品動作させるために始めたが、理由はDBのパフォーマンスは、時間の当初の見積り以内に完了されていません。他のスクリプトへのフォローアップには影響を与えないために、この操作は、製品をバックに復元されます放棄することを決めました。

開発

まず第一に、我々は、DBAが手動で殺す、実行中のクエリを検索してみましょう。

第二に、我々は戻って元のテーブルにバックアップテーブルと交換してください。

    RENAME APP.PRODUCT TO APP.PRODUCT_BROKEN;
    RENAME TABLE APP.PRODUCT_201910 TO APP.PRODUCT;

しかし、それはここで終わらない、多くのオリジナルのテーブルが戻ってプロパティを変更する必要があります。いくつかのステップを欠場することは容易であるため、このプロセスは、特別な注意が必要です。

设置シーケンス、デフォルト値

これは、比較的一般的であり、速すぎて、いくつかの手順を実行します。

シーケンスを追加します。

    DROP SEQUENCE APP.PRODUCT_ID_SEQ
    ALTER TABLE APP.PRODUCT MODIFY PRODUCT_ID NUMBER(10,0) DEFAULT APP.PRODUCT_ID_SEQ.NEXTVAL

設定されたデフォルト値

    ALTER TABLE APP.PRODUCT MODIFY PRODUCT_KEY VARCHAR2(300 CHAR) DEFAULT '-1';
    ALTER TABLE APP.PRODUCT MODIFY PRODUCT_TYPE_ID NUMBER(5,0) DEFAULT -1;
    ALTER TABLE APP.PRODUCT MODIFY DATE TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP;

拘束を設定します

  1. プラス主キー。
  2. テーブルへの外部キーのリンクがあるかどうか確認してください。
    -- 1
    DROP CONSTRAINT APP.PRODUCT_PK
    ALTER TABLE APP.PRODUCT ADD CONSTRAINT APP.PRODUCT_PK PRIMARY KEY ("PRODUCT_PK");
    
    -- 2
    SELECT * FROM DBA_CONSTRAINTS A, DBA_CONSTRAINTS B 
    WHERE A.CONSTRAINT_TYPE = 'R'
    AND A.R_CONSTRAINT_NAME = B.CONSTRAINT_NAME
    AND A.R_OWNER = B.OWNER
    AND B.TABLE_NAME = 'PRODUCT'
    AND B.OWNER = 'APP';

インデックスを設定します。

少し遅いかもしれインデックスを追加します。

    DROP INDEX APP.IDX_PRODUCT_KEY_DATE

    CREATE INDEX APP.IDX_PRODUCT_KEY_DATE ON APP.PRODUCT ("PUBLIC_KEY", "END_DATE") 
    PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
    TABLESPACE "TABLESPACE_1";

インデックス、主キーを追加作成する必要はありません、注意すべきです。

Oracleは、一意キーまたは主キーに一意のインデックスを作成することによって、テーブルの上にUNIQUEキーまたはPRIMARY KEY整合性制約を施行します。制約が有効になっている場合に、このインデックスは、Oracleによって自動的に作成されます。

依存関係を設定

依存オブジェクトの再構築:ここでの再構成が唯一の直接依存するオブジェクトです。

    -- check sql
    SELECT * FROM DBA_DEPENDENCIES A WHERE A.REFERENCED_NAME = 'PRODUCT' AND A.REFERENCED_OWNER = 'APP';
    -- modify sql
    SELECT 'alter '||DECODE(TYPE,'PACKAGE BODY','PACKAGE',TYPE)||' '||OWNER||'.'||NAME||' compile;' 
    FROM DBA_DEPENDENCIES A 
    WHERE A.REFERENCED_NAME = 'PRODUCT' 
    AND A.REFERENCED_OWNER = 'APP';

特権セット

権限の再構築

    -- check sql
    SELECT * FROM DBA_TAB_PRIVS WHERE TABLE_NAME = UPPER('PRODUCT') AND OWNER = UPPER('APP');
    -- modify sql
    SELECT 'grant ' || PRIVILEGE || ' on ' || OWNER || '.' || TABLE_NAME || ' to ' || GRANTEE || ';'
    FROM DBA_TAB_PRIVS
    WHERE TABLE_NAME = UPPER('PRODUCT')
    AND OWNER = UPPER('APP');

概要

上記に加えて

  • シーケンス、デフォルト値
  • 制約
  • 指数
  • 依存
  • 特権

、そこマテリアライズド・ビューをし、マテリアライズド・ビュー・ログをしている、あなたは、特定の参照リンクを参照してくださいすることができます。

だから、名前の変更方法とかなり厄介です。データの量は、多くのケースではない場合、あまりエラーが発生しやすい便利で簡単な、直接、元のテーブルにデータを挿入することをお勧めします。

参考リンク

おすすめ

転載: www.cnblogs.com/maxstack/p/11714559.html