- PR -

Updateで影響のあった更新行を知りたい!!

投稿者投稿内容
butthead
大ベテラン
会議室デビュー日: 2004/01/14
投稿数: 162
投稿日時: 2005-04-04 12:40
お世話になります。

環境はOracle10gですが、すべてのDBに対して対応できるようにしたいので、
ROWIDは使ってません。

Update文を使う際、where句にて設定した条件に当てはまる行がいくつもあった場合には、複数更新されてしまいますが、その意図されずに更新された行を知る方法というのはないのでしょうか。数だけならば、最初に更新する前に select count ・・・ 文でいいかと思いますが、更新された行をほかの何らかの形でわかる方法はないのでしょうか。

よろしくお願いします。m(__)m
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-04-04 13:20
次に update した時に更新される行なら、update と同じ条件で select を発行すれば良いだけのような気がします。
何か問題がありますでしょうか

update 実行後に予期しなかった更新のある行を調べたいのかと思いましたが、それにしては最初に更新する前に云々と書いていらっしゃるので、どういう場面で利用する方法をお探しなのかわかりませんでした。
butthead
大ベテラン
会議室デビュー日: 2004/01/14
投稿数: 162
投稿日時: 2005-04-04 14:12
>update 実行後に予期しなかった更新のある行を調べたいのかと思いましたが、

すいません。自分の説明が悪かったですね。
上記のとおりです。

自分の意図しない更新された行をどうやって調べるかについてです。
VIM
ベテラン
会議室デビュー日: 2003/11/14
投稿数: 76
投稿日時: 2005-04-04 15:04
安直に考えるなら、
対象テーブルに更新日時フィールドを用意すればよいかと。
あとは、前回更新チェック日時を保存している場所をどこかに用意しておく。

【更新作業】
(1)対象テーブルを更新
(2)更新トリガーで対象レコードの更新日時フィールドをSYSDATE(or NOW)に。
※(1)のUPDATEで直接更新日時フィールドをUPDATEすれば、(2)は必要ない。

【更新チェック作業】
(1)SELECT * FROM 対象テーブル WHERE 更新日時 > 前回更新チェック日時
(2)前回更新チェック日時を、現在の日時に更新。

安直な考えのため、パフォーマンスは論外です。

[ メッセージ編集済み 編集者: VIM 編集日時 2005-04-04 15:05 ]
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2005-04-04 15:33
引用:

自分の意図しない更新された行をどうやって調べるかについてです。



無理です。
#プログラマや操作者の意図なんぞ、一々察してくれるとは思えません(TT

引用:

環境はOracle10gですが、すべてのDBに対して対応できるようにしたいので、



これは非常に厳しい条件です。普通は「これとこれとこれに対応」と列挙するくらいが無難だと思います。これは絶対に絶対に必要な条件なのですか?
もし「あんまり特定のDBに依存しない方がいいよね」程度のノリなら、絶対に止めた方がいいです。凄いコストがかかります。

……と、茶々を入れるだけというのも何ですので、状況を絞って回答しますが。

---

Oracleなら更新行数はSQL%ROWCOUNTに入ってるらしいです。これ系で考えるなら各DB依存になりますので、「全て」と言われると収束はしません。

JDBCとかを通して更新するなら、Statement#executeUpdateが更新行数をリターンしてくれたりします。各DB依存の部分は各ドライバさんが吸収してくれるはずです。

あとはVIMさんが書いてらっしゃるように、そのUPDATEで更新された行であるということを確認するための項目を作っておいて、それをUPDATE後にSELECT COUNTする方法ですね。
タイムスタンプでも大体は大丈夫だと思いますが、厳密に作るなら採番テーブルでも用意して、識別用の項目に毎回意図的に入れ込んでやることになると思います。

るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2005-04-04 15:43
るぱんです。

PGやSEが意図しなくなったらもはや存在価値は無いのでは・・・?
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-04-04 15:54
その意図しない更新行をどう使うつもりかは
わからないですが、普通に更新前にselect
かけるのが一番簡単で良いと思うのですが。

不都合あるんでしょうか。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2005-04-04 15:59
「すべてのDBで対応云々」とあるので、DBから直接変更履歴を引っ張り出したい、
と考えていらっしゃるのでは。
それはさておき、私も、「意図しない更新」とやらがバグとどう違うのか、興味があります。

スキルアップ/キャリアアップ(JOB@IT)