• ベストアンサー
  • すぐに回答を!

トリガーとシーケンスについて

DBはOracle9i(Ver9.2.0.1かな?)です。 テスト環境から本番環境にデータ移行する際に テーブルも変更を加えました。 すると変更を加えたテーブルに関連するトリガーが未コンパイル状態になってしまいました。 仕方なく、再コンパイルするとトリガーに記述のあるシーケンスの最終番号が若干ずれていました。 コンパイルすることによってずれることがあるのでしょうか? シーケンスは初期化されたわけではなく、若干ずれてるだけです。 そのシーケンスを使用して登録処理を行っているので一意制約違反がでまくりです。 どなたかアドバイスお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数775
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1
  • shangzi
  • ベストアンサー率47% (17/36)

テスト環境のデータと、本番環境のデータの同期はいつとっておられますか?  テスト環境で1個のシーケンス、本番環境で1個のシーケンスを採番されておられますか?  シーケンスのキャッシュ(綴りが分からない~;;)には何を指定されていますか?  シーケンスは一意の番号を提供しますが、1,2,3,4・・・って順々とは限りません(機能的にはそうですが)1,2,5,6でもいい訳です、キャッシュに指定した値を予め取っておくので、動作のタイミングによって、続き番号の値にはならない事があります。  例えば本番環境でAさんがインサート文を実行した時に、キャッシュ内にはもう1~20とかまで使われる前提で採番されてる訳です。それを1~10まで使って、次にBさんがシーケンスナンバーを採番したとすると、21~30って具合になる訳です。  テスト環境と、本番環境で違うシーケンスを使ってるとしたら、番号が同じとは限りません。  キャッシュの値を両方1にしたら、出来るかもですが・・・本番環境とテスト環境の同期を確実にしたいなら、テスト環境で独自にシーケンスを採番しない方がいいと思います。    

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • Oracleのトリガーについて

    Oracleのトリガーについて質問です。 旧システムから新システムへデータ移行を行おうとしているのですが、 新システムではNEWテーブル(仮名)が新規で追加されています。 データ移行の方法として、旧システムのダンプファイルをエクスポートし、 新ステムにユーザを再作成後インポートしました。 その後、あらかじめ新システムでNEWテーブルのみテーブル指定のエク スポートを行っていたダンプファイルより、追加でインポートを行いました。 これでデータ移行完了と思っていたのですが、NEWテーブルのデータはトリガー により生成されるらしいのですが、どのタイミングで生成されるのでしょうか? データ移行完了時はデータ0件です。 NEWテーブルをインポートする順番が逆なのでしょうか? それともインポートではトリガーは起動しないのでしょうか? または、トリガーの仕組みが消えている(?)のでしょうか? (納入先に行かないと確認できない状態なので実際のデータベースが確認できません…) Oracleはあまり詳しくないため、わかりづらい質問かもしれませんが よろしくおねがいします。 【環境】 Oracle11g R2 Windows2008Server

  • トリガーを使ったリモートDBの更新方法

    いつもお世話になっております。 先に質問の内容を言うと、トリガーを使って、別のDBの同一テーブルの登録・更新をすることが可能かどうか?ということです。 現在は、とあるテーブル(以下Aテーブル)を登録・更新した場合、登録データを履歴ログテーブルに入れ、1日に一回決められた時間に履歴ログテーブルをファイルに出力し、別のDBに送った後にログを元に登録するという流れになっている処理があります。 それを、できる限りリアルタイムで更新できないかという話がでてきまして、その手段として質問の内容が可能かどうかということです。 以下の方法を試みましたが、どちらも問題があり、解決できそうにありませんでした。 ・dblinkを使用  ⇒新たにインストールが必要であり、現状の環境でということなので却下。 ・トリガーから呼ばれる関数に、Cのソースからコンパイルされた動的にロードされるオブジェクトを読み込んで、オブジェクト内からリモートDBに接続に行く  ⇒postgreSQLのCのオブジェクトを読み込む関数を作る際に、DB接続関数「PQconnectdb」が未定義とかで認識してくれない。 上記2つ以外にリモートDBに繋ぎにいく手段をご存知の方がいましたら、ぜひともご教授いただきたいと思いますm(_ _)m

  • SQL Server INSERTのトリガで採番

    データINSERT時にトリガを使い主キーを 採番したいのですが、少々コーディングに 困っていてます。 わかる方どうぞ、助言をお願いします。 主キー yyyymm+n(5) 採番したまではよかったのですが、 INSTEADテーブル(トリガのバッファテーブル?)の 主キーのフィールドに 格納する方法がわかりません。 どうもORACLEと記述方法がまるで違うので かなり苦戦しています。 テーブルが確定してるので現状の フィールドレイアウトやデータ体系を変更することは できません。よろしくお願いします。

その他の回答 (1)

  • 回答No.2

本番のシーケンスを更新するのではだめ?

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • Oracleのシーケンスありのテーブル作成について

    Oracleのテーブルを作るのに、ある列を自動で「全体の通し番号」みたいなユニーク(一意)な番号を振りたいく、 シーケンス(sequence)を作成しテーブルを作ろうとしているのですがうまくいきません。 どこがわるいのでしょうか。 create sequence "yamaaf_seq"; CREATE TABLE TBL_AFFILIATE_SESS( UNIQ_ID NUMBER(11,0) DEFAULT nextval('yamaaf_seq') NOT NULL, ORG_CODE VARCHAR2(64) NOT NULL, primary key("UNIQ_ID"));

  • DDLトリガーの作成にて

    お世話になります。 oracleにDDLトリガーを作成したいのですが、エラーが出て作成出来ません。 AFTER DDL on DATABASEのAFTERのところで エラー内容:「ORA-04072: トリガー型が無効です」 が発生します。 試しに、AFTER insert にするとここの部分は通るのですが、作成したいのはCREATEやDROPの時に起動するDDLトリガーなのです。 ちなみに、AFTER create or drop としても同じエラーが発生します。 ネットやoracleのリファレンスも見ましたが今だ解決出来ないでおりますので、ぶしつけな質問なのですが、どこが悪いのか教えて戴きたいです。 -- 作成するトリガーは下記となります ------------------------------------- CREATE OR REPLACE TRIGGER SYS.AFTER_DDL_EVENT AFTER DDL on DATABASE WHEN (ora_sysevent not in ('AUDIT','TRUNCATE')) DECLARE VCW_MODULE varchar2(48) := null; NW_CNT number := 0; BEGIN insert into ログ格納テーブル ・・・ if ( ora_sysevent = 'CREATE' ) then ・・・ elsif ( ora_sysevent = 'DROP' ) then ・・・ end if; END; / です。CREATEやDROPが発生した時にログを残したいのです。 oracle8ではDDLトリガーは作成出来ないってことは無いですよねぇ・・・。 環境は、oracle8、windowsNTサーバー 以上、誰か教えて~

  • OracleのTrigger(トリガー)について

    いつもご親切にありがとうございます。 Oracleのトリガーについて教えてください。 テーブルA ----------------- 日付 date型 品名 char(15) 営業所 cahr(5) フラグ char(1) データをINSERTする際に、下記のように変更したいです。 (1)日付が2月且つ、営業所が00001の場合は99999に変更、 (2)日付が2月且つ、品名の後ろ5桁が00001の場合後ろ5桁だけを99999に変更 下記のようにトリガーを作成しているんですけど、 (2)をどのように入れたらよいでしょうか? CREATE OR REPLACE TRIGGER TRG_テーブルA BEFORE INSERT ON テーブルA REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW BEGIN IF ( to_char(:NEW.日付,'YYYYMM') = '201502' ) AND ( :NEW.営業所 = '00001' ) THEN :NEW.営業所 := '99999'; END IF; END; / よろしくお願いします。

  • SQLスクリプト内で、${変数}と記述しても値を認識できない?

    USER.TABLE_LNK_TRG.shにて、トリガ作成スクリプトUSER.TABLE_LNK_TRG.sqlをコンパイルしようとしています。 USER.TABLE_LNK_TRG.shとUSER.TABLE_LNK_TRG.sqlともに 変数ORACLE_SID_1の値としてdb1、 変数ORACLE_SID_2の値としてdb2 が入っているはずなのですが、USER.TABLE_LNK_TRG.sql内では ${ORACLE_SID_1}と${ORACLE_SID_2}がそのまま文字列として解釈され (変数の値であるdb1、db2にはならない)、コンパイルに失敗します。 逆にUSER.TABLE_LNK_TRG.sql内で、${ORACLE_SID_1}と${ORACLE_SID_2} を使わず、直接db1、db2と記述すると成功します。 トリガ作成スクリプトUSER.TABLE_LNK_TRG.sql内で、${変数}は使えないのでしょうか? 環境はOSはSolaris、DBはOracle9i、シェルはBシェルです。 _______________________________________________________________ ~USER.TABLE_LNK_TRG.sh~ #!/bin/sh ORACLE_SID_1="db1" ORACLE_SID_2="db2" #トリガコンパイル sqlplus aaa/aaa <<-EOF @USER.TABLE_LNK_TRG.sql quit EOF exit ______________________________________________________________ ~USER.TABLE_LNK_TRG.sql~ CREATE OR REPLACE TRIGGER USER.TABLE_LNK_TRG BEFORE UPDATE ON USER.TABLE FOR EACH ROW declare begin update TABLE@${ORACLE_SID_1}_lnk set col = :new.col; update TABLE@${ORACLE_SID_2}_lnk set col = :new.col; exception when others then null; end; / _______________________________________________________________ ※${ORACLE_SID_1}、${ORACLE_SID_2}のままコンパイルされるので、  ${ORACLE_SID_1}_lnkのDB環境、${ORACLE_SID_2}_lnkのDB環境が存在せずコンパイルエラー。  逆に直接db1、db2と記述するとdb1_lnkのDB環境、db2_lnkのDB環境が存在するので正常にコンパイル。

  • テスト環境と本番環境で、DBからのデータ取得にかかる時間に違いがある。

    お世話になります。 WebサーバとDBサーバを使用して構築したシステムが あります。 テスト環境と本番環境があり、それぞれ、以下の様になってます。 テスト環境 Webサーバ   Windows2000 Server+IIS5.0+ .NET Framework DBサーバ   Windows2000 Server+Oracle8.0.6 本番環境は Webサーバ   Windows2000 Server+IIS5.0+ .NET Framework、 DBサーバ   Solaris(バージョン分からず)+Oracle8.0.6 となっています。 テスト環境と本番環境の違いについてですが、 Webサーバの方は、スペックは違いますが、 その他の環境は同じです。 DBサーバの方は、OSの違いとOracleのデータベースの定義に少し違いがあるかもしれませんが、 データの件数とテーブルの定義は同じです。 そこで肝心の質問の件なのですが、 テスト環境と本番環境で、同システムを実行した際に、 DBからのデータ取得にかなりの時間の差があるのです。 テスト環境で、2~3分で終わる処理が 本番環境だと、30分くらいかかってしまいます。 何が原因でこのような状態になっているか分からず、 すごく悩んでいます。 ネットワークの速度にはそれほど違いはないのですが・・・。 また、マシンスペックは本番環境の方が高いです。 どんな細かい情報でもかまいませんので、 ここが怪しいのではないか?とかありましたら、 ご教授お願いします。 また、他に必要な情報とかありましたら、 できる限り調べますので、どうぞよろしくお願いします。

  • データベースの移行方法

    質問させていただきます。 サーバの変更に伴い、データベースをサーバ(A)からサーバ(B)に移行し、サーバ(A)とサーバ(B)を全く同じして、クライアントがこれまで通りデータベースを利用できるようにしたいと考えています。 新たに購入したサーバ(B)に社内にあったマニュアルを元にしてOracle9iをインストールし、DBの作成したところまで進めているのですが、その後のデータの移行がよく分かりません。expやimpコマンドを使って行うとできるらしいのですが、よく分かっていません。 社内のマニュアルには新たにDBを作成する方法は書いてあるのですが、データの移行については書いておらず、困っています。 私が全くOracleについて知らないので、質問内容が分かりずらいとおもいますが、回答いただけるとありがたいです。 ●環境 サーバ(A)   OS:windows server 2000 oracleのバージョン:oracle9i Database (9.2.0.1.0) サーバ(B)   OS:windows server 2003 oracleのバージョン:oracle9i Database (9.2.0.1.0) OSの違い以外は社内マニュアルを元にして同じ設定にしてあります。 よろしくお願いします。

  • DBA管理者に報告する情報について

    環境:Oracle9i 9.2.0 利用者:100人ほど 事務所移転に伴ってDBサーバも移行されることになりました。 そのついでといってはなんですが、移行作業からメモリ、性能などの調査もDBA管理者に依頼することになりました。 そこで、まず初回の打合せで必要な情報を伝えなければなりません。 漠然とでも結構ですのでどなたかアドバイスお願いします。 漠然と思いつく内容 ・サーバはRAID5構成でディスクは3台 ・DB全体のテーブル数(マスタ系、トランザクション系) ・初期化パラメータ

  • Access Oracle環境の切替方法

    ODBCにてOracleに接続を行うAccessを作成し、ユーザに使用頂いております。 2つのサーバがあり、それぞれOracleの本番環境、テスト環境としています。 (双方に作成したテーブルのDB名、スキーマ名は同一です) 開発用端末である自分の端末には、テスト用サーバへ接続するためのtnsnames.oraが、またユーザの端末には、本番用サーバへ接続するためのtnsnames.oraがセットされています。 自分の端末にて開発・テストが済んだら、ユーザの端末にAccessファイルを配布。 しかしこの度、テスト用サーバが撤去されることになりまして、、、これまで本番環境として使用していたサーバにテスト環境を同居させた場合、Accessファイルを変更する事なく 本番⇔テスト を切り替えるようテスト環境を構築する方法はありますか? テーブルはリンクして使用しております。DB名やスキーマ名を別名で作成をと考えましたが、Access内で指定されるのでNGですよね。。。 よろしくお願いします。

  • oracleのエクスポートについて

    こんにちわ 質問なんですが、oracleのデータを他のマシンに移行するためにテーブルをエクスポートしようと思うのですが、エクスポートする際、シーケンスもいっしょにエクスポートすることは可能なのでしょうか?

  • 11gにて開発、10g環境で動作は可能ですか

    あるシステムのDB管理を行うにあたり、 Oracleを使用しているのですが、 Oracleのバージョンの違いにより、 動作に不具合が起こる事などございますでしょうか? 詳細は以下です。 ローカル環境のシステム Oracle 10g / 10.2.0.3.0 社内環境のシステム Oracle 11g / 11.2.0.1.0 社内環境システムよりバックアップを行い(スクリプト出力)、 ローカル環境に対してスクリプト実行した場合、DBの動作 自体に何か不具合が起こるのでしょうか?