Oracleで元表から新しい表を作成する方法
データベース・リンクの作成
データベース・リンクとは2つの物理的なデータベース・サーバー間の接続のことで、これにより、クライアントからそれらのサーバーに1つの論理データベースとしてアクセスできるようになる。異なるデータベース間で、マテリアライズド・ビューを作成するときに必要である。また、異なるデータベース上の表から、直接的に新しい表を作成する場合にも便利である。
データベース・リンクの種類
- 接続ユーザー・リンク
- ユーザーはユーザー自身として接続。ユーザーにはローカル・データベースのアカウントと同じユーザー名を持つリモート・データベースのアカウントが必要。
- 固定ユーザー・リンク
- ユーザーは、リンク内で参照されるユーザー名とパスワードを使用して接続。
- 現行ユーザー・リンク
- ユーザーは、グローバル・ユーザーとして接続。ローカル・ユーザーは、ストアド・プロシージャのコンテキスト内ではグローバル・ユーザーとして接続できる。
データベース・リンクのタイプ
- プライベート
- パブリック
- 所有者はPUBLICと呼ばれるユーザー。データベース全体にわたるリンクを作成。データベース内のすべてのユーザーとPL/SQLサブプログラムが、パブリック・リンクを使用して、対応するリモート・データベース内のデータベース・オブジェクトにアクセス可。
- グローバル
データベースリンクを作成する権限の付与
- CREATE SESSION権限
- リモート・データベースを参照するために必要
- CREATE DATABASE LINK権限
- プライベート・データベース・リンクの作成に必要
- CREATE PUBLIC DATABASE LINK権限
- グローバル・データベース・リンクの作成に必要
ローカル・ネーミング・パラメータの追加
- $ORACLE_HOME/network/admin/tnsnames.oraを編集して、データベース・リンクの対象となるサーバーを追加する。
- 失敗する場合は以下のように設定
- ネット・サービス名を '.'(ドット)でつながれた名前にしない。
- ネット・サービス名とサービス名を一致させる。
- 初期化パラメータGLOBAL_NAMESをfalseに設定する。
以下の例では、固定ユーザーでプライベートなデータベース・リンクを作成している。
- ローカル・ネーミング・パラメータの追加
$ORACLE_HOME/network/admin/tnsnames.ora [ネット・サービス名]= (DESCRIPTION= (ADDRESS=(PROTOCOL=TCP)(HOST=[アドレス])(PORT=[ポート番号])) (CONNECT_DATA=(SERVICE_NAME=[サービス名])) )
CREATE DATABASE LINK databaselink_name CONNECT TO [ユーザー名] IDENTIFIED BY [パスワード] USING '[ネット・サービス名]';
元表からマテリアライズド・ビューを作成
マテリアライズド・ビューとは「実体のあるビュー」のこと。参考サイト
利用方法
- リモート・データベース上に存在するデータをローカル・データベース上に定期的にコピーする目的で使用される。スナップショットと同じもの。
- ローカル・データベース上のデータの集計や結合処理を高速化するために使用される。
権限
- GRANT CREATE MATERIALIZED VIEW TO [ユーザー名];
リフレッシュ
- 完全リフレッシュ(全データ)
- REFRESH complete
- 高速リフレッシュ(差分のみ)
- REFRESH fast
- 元テーブルに対して「マテリアライズド・ビュー・ログ」が必要となる。
- 詳しくはオラクル マテリアライズド・ビューメモへ。
- 高速リフレッシュ可能なら高速、そうでないなら完全(デフォルト)
- REFRESH force
- リフレッシュなし(手動でのリフレッシュ指示も無効)
- never REFRESH
再計算タイミング
- コミット時
- on commit
- 一定間隔
- start with '日時' next 次の計算日時を求める式
- start with '2005/2/6' next sysdate + 1
- 以下のSQLで実行タイミングを確認できる。
- SELECT last_date,last_sec,next_date,next_sec,interval,what FROM user_jobs;
- 指定時(デフォルト)
- on demand
手動で計算し直す
クエリーリライト機能
- SQLを変更せずに自動的に表への参照をマテリアライズド・ビューへの参照に置き換えることが可能となる。
- 詳しくは8 基本的なマテリアライズド・ビューへ。
以下の例では、"REFRESH fast on commit"を指定することで、元表の更新がリアルタイムにマテリアライズド・ビュー(スナップショット)に反映されている。
CREATE MATERIALIZED VIEW [マテリアライズド・ビュー名] REFRESH fast on commit AS SELECT * FROM [元表名];
元表からテーブルを作成
元表からテーブルを作成するときに、プライマリキーも設定できる。CREATE TABLE [表名] AS SELECT * FROM [元表名]; ALTER TABLE [表名] ADD CONSTRAINT [表名_PK] PRIMARY KEY ([プライマリキー1],[プライマリキー2],…);
データの更新は"TRUNCATE"後に"INSERT INTO SELECT"でもよい。
データの挿入
"INSERT INTO"の構文は以下の通り。INSERT INTO [表名] ([列名1],[列名2],…) VALUES ( [値|式|SELECT文|問い合わせ]… ); または、 INSERT INTO [表名] ([列名1],[列名2],…) [SELECT文|問い合わせ];
インラインビューを使った更新
deptnoが'100'所属の全員のusernameに「氏」を追加する。インラインビューを使った更新は、WHERE句に同じ副問い合わせを繰り返し記述するよりもパフォーマンスがよいことが多い。UPDATE ( SELECT deptno, username FROM user_master WHERE deptno = '100' ) SET username = username || '氏'; /* こちらの方がパフォーマンスが劣る WHERE deptno = '100'; */
テーブルのインポート/エクスポートの方法
ダンプ・ファイルの作成に使用したexpより前のバージョンのimpは使用できないので、注意すること。以下のコマンドをコマンドラインから直接実行するか、ファイルに記述しshスクリプトとして実行する。
テーブルを「ora.dmp」にエクスポートする
各種パラメータは「par.txt」から読み込むこともできる。exp usr02/passwd file=ora.dmp tables=table1,table2
ダンプファイル「ora.dmp」をインポートする。
各種パラメータは「par.txt」から読み込むこともできる。imp usr01/passwd file=ora.dmp parfile=par.txt
パラメータファイル「par.txt」の記述例
fromuser=usr02 touser=usr01 tables=table1,table2