質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

Q&A

解決済

3回答

8522閲覧

Oracleレコードの更新後・更新前の差分の取り方について

saito.kaz

総合スコア76

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

0グッド

0クリップ

投稿2019/05/30 06:05

Oracle11gを利用しているのですが、処理実行前のレコードと処理実行後のレコードを比較して、
UI上で操作を行った際に、どのテーブルのどのレコードに値が追加されたのか把握したいと考えております。

【背景】
・パッケージ製品を利用しているのですが、データベースの情報が公開されていないため、どのレコードを修正すれば分からない。

【行いたいこと】
・製品のUI上で値を追加した際に、どのテーブルのどのレコードに値が入っているのか調査したい。

【利用しているツール】
・SQL Developer

SQL Developerで処理実行前の状態と処理実行後の状態を比較できれば良いのですが、当該製品で難しい場合、
他のツールで可能であれば、そのツールを教えて頂けないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/05/30 06:24 編集

> パッケージ製品を利用しているのですが、データベースの情報が公開されていないため、どのレコードを修正すれば分からない。 そんなブラックボックスについて、いったいどんな回答があるかもしれないと思われたのですか? せめて、そのパッケージの製品名位は追記しましょうよ。
saito.kaz

2019/05/30 07:01

SAPです。要するに外部連携(別製品)される際に、顧客が利用される製品について、どのような影響があるかデータベース面から検討したいと思っております。それが確実かと思いました。
sazi

2019/05/30 07:31

SAPならテーブル情報とか公開されてるのでは?
sazi

2019/05/30 07:33

SAPと連携するシステムを構築しようとしていて調査って事ですか?
saito.kaz

2019/05/30 07:37

すみません、特定を防ぐためにSAPと申し上げました。 製品名までは言えませんが、テーブル情報が公開されていない製品です。 「連携することで、SAP(仮)にどのような値が入るのか」を見たいだけです。 データ連携される前のSAPのテーブルとデータ連携された後のSAPのテーブルでは、 更新されることで差分ができます。(どのテーブルのどのカラムに値がInsertされたかなど。)その差分を簡単に見られる方法・ツールを把握したいと考えております。
sazi

2019/05/30 07:47

目的が良く分かりません。 その製品の解析が目的ですか? それとも外付けでその製品が使用してるテーブルの内容を更新されようとしているのですか? 後者なら止めた方が良いと思います。
saito.kaz

2019/05/30 08:02

製品の解析ではありません。 テーブルの内容が更新というのは、テーブルの構造に変更を加えるというのではなく、既存のテーブルに対して、単純に値が追加されるだけです。 その追加される対象・テーブルを把握したいだけです。
sazi

2019/05/30 08:06

何のために把握するのですか? 把握だけが目的なら製品の解析ですよね?
saito.kaz

2019/05/30 08:16

例えば、saziさんが製品Aの開発を担当されるとします。その製品Aは他の会社が開発しており、何も引き継ぎがなく仕様書がないとします。その状態でいきなり、SAP上のボタンAを押下したときに、製品Aから連携されてくる情報が何か特定しろと言われたとします。どのように調査しますか?
sazi

2019/05/30 08:19 編集

> 製品Aから連携されてくる情報が何か特定しろと言われた 特定する事の目的を確認しているのです。 目的が違えばアプローチも変わってきます。
saito.kaz

2019/05/30 08:23

失礼しました。目的は仕様の理解です。 製品AとSAPの連携時の仕様の理解です。
sazi

2019/05/30 08:27

一応回答しました。 仕様の理解なら尚の事、俯瞰的にみなければなりません。 更新後・更新前の差分を確認するのは、理解が正しいかどうかの裏付け程度ですね。
saito.kaz

2019/05/30 08:57

そうですね。裏付け的な要素が大きいです。 ER図についてはあるのですが、主キーを追ってもどこまで値が連携されていくのか分かりづらく。 何かレポートを出して比較するなどの方法はありますでしょうか。
sazi

2019/05/30 10:53

ER図があるのに、「主キーを追ってもどこまで値が連携されていくのか分かりづらく」というのは普通ないです。 ER図の精度が低いか、あなたが慣れていないかの何れかです。 ER図の精度については、実際のDBと乖離があるなら、実DBの情報で補完するしか無いですね。
Orlofsky

2019/05/30 13:00

こっちで激戦が。笑い >製品AとSAPの連携時の仕様の理解です。 製品AとSAP?もどきに公開できる情報をもらっては? バグが発生した時、どこが原因でどうやってデータを修復したり適応して解決できたとこにするか?ってけっこう難しくて泥沼ののしりあいになったり。。。守秘契約があるからここまで。笑
guest

回答3

0

ベストアンサー

一般的な Oracle におけるアクティビティの監視と言う観点から回答します。対象製品のリバースエンジニアリングに該当する可能性があるので、実際に適用する際には質問者の責任において開発元に確認するなりして厳密に対処してください。サードパーティー製品もけっこうありますが、Oracle の機能だけで実施可能なものを上げます。

1.Materialized View Log
Materialized View Log には変更対象になる列の情報を含めることが可能です。Oracle 11g においては Materialized View Log が格納される実表に更新前後の値が含まれるため、簡単に参照することができます。実際には Orlofsky さんが提示されている Trigger の作成を Oracle に作成させるような手法となります。この手法の難点は実際には Materialized View を作成するわけではないのでログのクリアを手動で実施しなければならないことと、すべての表、すべての列を記録すると実用レベルではないほどの高負荷になります。以下にあげる手法とは異なりシーケンスから値を取得するなどの処理を記録することはできません。

2.Oracle LogMiner
REDOログやアーカイブログから scn 単位ですべての DML と DDL の実行履歴を参照することができます。使い方は検索してください。

3.Trace 10046
すべての SQL をトレースファイルに落とします。LEVEL 4 以上でバインド変数をログに落とすことができます。2の手法とは異なりシステムレベルの SQL もログに落ちるので解析は結構面倒です。

4.Oracle Streams
2とほぼ同じですが、レプリケーションに使用しているのが例が大半で調査に使用するための情報は少ないです。学習コストが高いのと 12c 以降では廃止されているので一番下にしています。DBMS_STREAMS_ADM パッケージを駆使して必要な情報を収集することになります。

投稿2019/05/30 17:07

編集2019/05/30 17:09
atata0319

総合スコア881

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そのデータを利用して情報を出力されようとしているなら、先ずはER図を起こされる事ですね。

製品のUI上で値を追加した際に、どのテーブルのどのレコードに値が入っているのか調査したい。

全てのオペレーションを網羅可能ですか?

ER図を起こせばUIとの関係も推測できますから、推測した想定でデータに変化があるかどうかを確認した方が漏れは無いと思います。

キーを元にデータ調査するくらいで変化の有無は確認できるでしょうから。

ER図をリバーシングできるDBツールもありますので、活用されると良いかと思います。

投稿2019/05/30 08:10

編集2019/05/30 08:36
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saito.kaz

2019/05/30 08:56

>>ER図をリバーシングできるDBツールもありますので、活用されると良いかと思います。 無料のツールでありますでしょうか。
sazi

2019/05/30 09:06

A5:SQLとかですかね。 ER図に特化したものだとERMasterとかありますけど、eclipsのアドインなので、使うには敷居が高いかもしれません。
guest

0

TRIGGERが使えます。AFTER UPDATE TRIGGERで
:OLD.カラム名 が更新前の
:NEW.カラム名 が更新後の内容です。
この内容を予め用意した別テーブルにINSERTします。
PL/SQLの知識が必要です。

投稿2019/05/30 06:17

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/05/30 06:24

> データベースの情報が公開されていないため、どのレコードを修正すれば分からない。
Orlofsky

2019/05/30 06:30

どのテーブルかは判るだろうから、sqlplus のDESC テーブル名で表示される全カラムの更新前後の情報を取得する。
saito.kaz

2019/05/30 07:02

DESCについてあまり分かっていないのですが、いま使っているデータベースは数千ありますが、ご教示いただいたDESCコマンドを利用すれば、簡単に把握できるものなのでしょうか。
sazi

2019/05/30 07:36

データベースが数千ですか? テーブル数が数千ではなく?
saito.kaz

2019/05/30 07:38

失礼しました。申し訳ございません。 データベースが一つで、テーブルが数千です。 誤記となります。
Orlofsky

2019/05/30 12:39 編集

desc については https://docs.oracle.com/cd/E16338_01/server.112/b56314/ch_twelve019.htm#i2697562 を確認してください。 数千テーブルに別テーブルとテーブル毎にTRIGGERを付けたらとっても遅くなるだろうし、TABLESPACEを置いたディスクのパンクの危険性があります。たとえ質問者さんが数千テーブルの更新前後の情報を取得出来ても、それを追跡するだけ能力はないでしょうから現実的な方法とは思えません。 Oracle11.2も既にどんなに大きなバグが発生しても新たにパッチは提供しない古いバージョンです。バグが発生したらパッチを提供してくれるバージョンに移行することも課題です。パッケージも上位バージョンで動作するかも確認しましょう。 パッケージ名を明示しないで一般の掲示版に質問するのも限界があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問