こんにちは、大阪本社勤務のIです。
前回と同様ORACLEに関することなのですが、
今回はOracle8iとOracle10gの差による、
ちょっとした躓きがありましたので投稿します。
前回お話したとおり、現在、僕が携わっているシステムは、
メインのシステムのデータベースがOracle10g、
サブのシステムのデータベースがOracle8iです。
データの更新はサーバ上でコマンドプロンプトから
SQL Plusを起動して行うのですが、
その際に「SPOOL」コマンドを使用して、
処理内容をファイルに出力し、ログとして残す決まりになっています。
また、メインのシステムはデータ更新の機会が比較的多いのですが、
サブのシステムはデータ更新の機会はほとんどありません。
そんな中、先日サブのデータ更新を行うことになり、
いつもメインで入力しているとおり、
SPOOL "○○○○.LOG" ←と入力しENTERキーを入力すると、
「SP2-0332: スプール・ファイルを作成できません。」と表示されます。
ディレクトリに書き込み権限がないのか?
…などと、いろいろ試みてみましたが、状況は変わりません。
困って上司に尋ねたところ、Oracle8iではファイル名をダブルクォートで囲うと、
このエラーが発生するとのことでした。
その後
SPOOL ○○○○.LOG ←と入力しENTERキーを入力すると、
何事も無かったかのように、ファイルが出力されました。
知っていればどうってことない話ですが、
普段当たり前のように使っていた「SPOOL」コマンドで、
まさかこんな罠があるとは…といった感じでした。
ではまた次回。
2013年1月8日火曜日
スナップショットの罠【ORACLE】
こんにちは、大阪本社勤務のIです。
開発ブログということで、簡単ではありますが、
自分が開発時につまづいた内容などを投稿していきたいと思います。
現在、僕が携わっているシステムは、
メイン(仮にシステムAとします)のシステムがOracle10g、
サブ(仮にシステムBとします)のシステムがOracle8iで、
それぞれにデータベースが存在します。
また、システムA、システムBにて共通のテーブルがいくつかありますが、
夜間処理にて、システムAとシステムBの内容の同期をする仕組みになっています。
最近システムAで、あるテーブルのデータを日中に変更する必要があり、
システムAのデータを変更後、システムBに反映しようとしました。
手順としては、
①システムBのテーブルのデータを全件 DELETE する。
②データベースリンクを使用し、システムAのテーブルから SELECT し、
システムBのテーブルに INSERT する。
…と考えていましたが、①を実行すると
「ORA-01732: このビューに対するデータ操作が無効です。」のエラーが出て、
データが削除できませんでした。
テーブルなのにビュー?…と思い、調べてみた結果、
システムBには、テーブル名と同名のスナップショットが存在していました。
□■□■□■□■□■ 調査メモ ■□■□■□■□■□
スナップショットとは、Oracleデータベース間で、データのバックアップを取る機能である。
スナップショットを作成すると、スナップショットと同名のテーブルが作成される。
そのテーブルに対して直接操作するには、スナップショットを作成する時に、
FOR UPDATE句を指定しないといけない。
スナップショットを同期するには下記のメソッドを使用。
DBMS_SNAPSHOT.REFRESH('スナップショット名','リフレッシュ方法')
リフレッシュ方法の内容
'F' ⇒ 高速リフレッシュ
'C' ⇒ 完全リフレッシュ
'?' ⇒ 強制リフレッシュ
'A' ⇒ 常にリフレッシュ
□■□■□■□■□■□■□■□■□■□■□■□■□
どうやらスナップショットが更新可能でなかったため、
DELETE 時にエラーが発生していたようです。
その後、当初考えていた手順ではなく、
DBMS_SNAPSHOT.REFRESH を実行することでテーブルの同期を行いました。
今回、スナップショットについて理解が乏しかったため、
このような現象に躓きましたが、良い勉強になりました。
この先、このようなことがあれば、投稿していきたいと思います。
開発ブログということで、簡単ではありますが、
自分が開発時につまづいた内容などを投稿していきたいと思います。
現在、僕が携わっているシステムは、
メイン(仮にシステムAとします)のシステムがOracle10g、
サブ(仮にシステムBとします)のシステムがOracle8iで、
それぞれにデータベースが存在します。
また、システムA、システムBにて共通のテーブルがいくつかありますが、
夜間処理にて、システムAとシステムBの内容の同期をする仕組みになっています。
最近システムAで、あるテーブルのデータを日中に変更する必要があり、
システムAのデータを変更後、システムBに反映しようとしました。
手順としては、
①システムBのテーブルのデータを全件 DELETE する。
②データベースリンクを使用し、システムAのテーブルから SELECT し、
システムBのテーブルに INSERT する。
…と考えていましたが、①を実行すると
「ORA-01732: このビューに対するデータ操作が無効です。」のエラーが出て、
データが削除できませんでした。
テーブルなのにビュー?…と思い、調べてみた結果、
システムBには、テーブル名と同名のスナップショットが存在していました。
□■□■□■□■□■ 調査メモ ■□■□■□■□■□
スナップショットとは、Oracleデータベース間で、データのバックアップを取る機能である。
スナップショットを作成すると、スナップショットと同名のテーブルが作成される。
そのテーブルに対して直接操作するには、スナップショットを作成する時に、
FOR UPDATE句を指定しないといけない。
スナップショットを同期するには下記のメソッドを使用。
DBMS_SNAPSHOT.REFRESH('スナップショット名','リフレッシュ方法')
リフレッシュ方法の内容
'F' ⇒ 高速リフレッシュ
'C' ⇒ 完全リフレッシュ
'?' ⇒ 強制リフレッシュ
'A' ⇒ 常にリフレッシュ
□■□■□■□■□■□■□■□■□■□■□■□■□
どうやらスナップショットが更新可能でなかったため、
DELETE 時にエラーが発生していたようです。
その後、当初考えていた手順ではなく、
DBMS_SNAPSHOT.REFRESH を実行することでテーブルの同期を行いました。
今回、スナップショットについて理解が乏しかったため、
このような現象に躓きましたが、良い勉強になりました。
この先、このようなことがあれば、投稿していきたいと思います。
2013年1月7日月曜日
ちょっとしたことで
こんにちは。
大阪本社勤務のMです。
今回初めてブログに記事を投稿します。
どうぞよろしくお願いします。
さて、今回はメールに関するちょっとしたテクニックを紹介します。
皆さんも仕事やプライベートでメールを送信する機会は多いと思います。
そして、メールでは返信期限を設定することがよくあります。
しかしその返信期限をメールにしっかり明記しているにもかかわらず
期限が過ぎてもちっとも返事が来ない…なんて経験ありませんか?
そんな時に役立つテクニック、それは
返信期限は日付だけではなく、具体的な時間まで指定する。
例えば
「○月×日 18:00までに返信お願いします。」
のように書くことで、期限までに返信が来る割合が3割もアップするのです。
ちょっとした工夫で、返事が来ないイライラを感じずに済むなら
やってみる価値ありですね!
大阪本社勤務のMです。
今回初めてブログに記事を投稿します。
どうぞよろしくお願いします。
さて、今回はメールに関するちょっとしたテクニックを紹介します。
皆さんも仕事やプライベートでメールを送信する機会は多いと思います。
そして、メールでは返信期限を設定することがよくあります。
しかしその返信期限をメールにしっかり明記しているにもかかわらず
期限が過ぎてもちっとも返事が来ない…なんて経験ありませんか?
そんな時に役立つテクニック、それは
返信期限は日付だけではなく、具体的な時間まで指定する。
例えば
「○月×日 18:00までに返信お願いします。」
のように書くことで、期限までに返信が来る割合が3割もアップするのです。
ちょっとした工夫で、返事が来ないイライラを感じずに済むなら
やってみる価値ありですね!
登録:
投稿 (Atom)