I. 変更プロセス仕様

前提条件

すべての変更は作業指示システムによる承認が必要です(設計文書添付必須)
実行者はDBA認定資格を保有していなければなりません
変更ウィンドウ:業務ピーク時間外(例:23:00-5:00)
スクリプト命名規則:
[プロジェクト番号][オブジェクト種別][機能]_[日付].sql
例:PROJ123_TBL_CreateOrderTbl_20230811.sql

II. オブジェクト作成仕様

1. ユーザーと表領域

-- ユーザー作成(デフォルト表領域の紐付け必須)
CREATE USER ops_user IDENTIFIED BY "S3cureP@ss#2023"
  DEFAULT TABLESPACE ops_data
  QUOTA UNLIMITED ON ops_data
  ACCOUNT UNLOCK;

-- 表領域作成(BIGFILEモード指定必須)
CREATE BIGFILE TABLESPACE ops_data
  DATAFILE '+DATA' SIZE 10G AUTOEXTEND ON NEXT 1G;

2. テーブルと索引

-- テーブル作成例(コメントとストレージパラメータ必須)
CREATE TABLE order_details (
  order_id   NUMBER(12)   PRIMARY KEY,
  product_id VARCHAR2(20) NOT NULL,
  amount     NUMBER(16,2) DEFAULT 0
) TABLESPACE ops_data
  PCTFREE 10 PCTUSED 80
  COMPRESS FOR OLTP;  -- 高度な圧縮を有効化

COMMENT ON TABLE order_details IS '注文明細テーブル';
COMMENT ON COLUMN order_details.order_id IS '注文固有ID';

-- 索引命名規則:IDX_[テーブル略称]_[カラム名]
CREATE INDEX IDX_ORDETAILS_PRODID ON order_details(product_id)
  TABLESPACE ops_index
  PARALLEL 4 NOLOGGING;  -- 並列処理で作成を高速化

3. ビューとシーケンス

-- ビューはOR REPLACEとFORCEオプション必須
CREATE OR REPLACE FORCE VIEW v_active_orders AS
SELECT /*+ INDEX(o IDX_ORD_STATUS) */
       order_id, product_id
FROM orders o
WHERE status = 'ACTIVE'
WITH READ ONLY;  -- 読み取り専用を強制

-- シーケンスはギャップ防止のためNOCACHE指定必須
CREATE SEQUENCE seq_order_id
  START WITH 1000000
  INCREMENT BY 1
  NOCACHE NOCYCLE;

RAC環境推奨設定: CACHE+NOORDER。order属性未指定時、RACはデフォルトでキャッシュ値20に設定します。高頻度使用シーケンスはキャッシュを1000~2000に調整します。

III. スクリプトコーディング仕様

要件例/説明
文字セット AL32UTF8必須
ファイルエンコーディング UNIX形式、BOMなしUTF-8
トランザクション制御 DMLは明示的なCOMMIT/ROLLBACK必須
バインド変数 ハードコーディング禁止(SQLインジェクション防止)
正しいDML例:

BEGIN
  UPDATE accounts SET balance = balance - :amt WHERE id = :acc_id;
  -- 例外処理の記述必須
  EXCEPTION WHEN OTHERS THEN
    ROLLBACK;
    RAISE;
END;
/
COMMIT;

IV. ロールバック計画設計

1. DDLロールバック(構造変更)

-- 元操作:カラム追加
ALTER TABLE orders ADD (discount NUMBER(5,2));

-- ロールバックスクリプト(事前生成必須)
ALTER TABLE orders DROP COLUMN discount;

2. DMLロールバック(データ変更)

-- 元操作:データ修正
UPDATE employees SET salary = salary * 1.1
WHERE dept_id = 'IT';

-- ロールバック計画(Flashback Query使用)
UPDATE employees e
SET e.salary = (
  SELECT salary
  FROM employees AS OF TIMESTAMP SYSDATE - 1/24  -- 1時間前
  WHERE employee_id = e.employee_id
)
WHERE dept_id = 'IT';

3. オブジェクト削除ロールバック

-- 削除前バックアップ(標準操作)
CREATE TABLE orders_bak_20230811 AS
SELECT * FROM orders;

-- ロールバックコマンド
RENAME orders_bak_20230811 TO orders;

V. 緊急時対応

誤削除データ復旧

-- Flashback Table使用(行移動の有効化が必要)
ALTER TABLE orders ENABLE ROW MOVEMENT;
FLASHBACK TABLE orders TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '15' MINUTE);

パフォーマンスロールバック計画

索引変更後の性能劣化時:

-- 高速索引ロールバック
DROP INDEX new_index_name FORCE;
CREATE INDEX old_index_name ... NOLOGGING PARALLEL 8;  -- 並列処理で再構築

VI. バージョン管理要件

プロジェクトディレクトリ構造:
├── scripts
│ ├── deploy # デプロイスクリプト
│ ├── rollback # 対応ロールバックスクリプト
│ └── logs # 実行ログ(タイムスタンプ付き)
└── docs
└── ER_diagram.pdf # 設計文書

重要原則:すべての本番環境変更は「監査可能、ロールバック可能、追跡可能」の3原則に従わなければなりません。スクリプト実行後、ログは自動的にDBAチームへメール送信する必要があります。