- PR -

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

投稿者投稿内容
VIM
ベテラン
会議室デビュー日: 2003/11/14
投稿数: 76
投稿日時: 2005-04-04 16:08
「意図しない更新」って、
Program-Aで更新したレコードを
Program-Bで抽出したいってことじゃないの?
# [Program]を[Process]で置き換えても良し。

私はそう考えてました。
めだか
大ベテラン
会議室デビュー日: 2004/11/11
投稿数: 109
投稿日時: 2005-04-04 16:20
全てのDBに対応ってのはちょっと現実的じゃないような気がしますが
Oracle特有の機能は全く使わないって事ですよね
多大な労力使ってわかりにくいコードになって性能は低下
メンテしにくい他にもいろいろデメリットありそうですが
それを上回るメリットがあるのかな?
butthead
大ベテラン
会議室デビュー日: 2004/01/14
投稿数: 162
投稿日時: 2005-04-04 16:27
>無理です。
>#プログラマや操作者の意図なんぞ、一々察してくれるとは思えません(TT

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

>これは非常に厳しい条件です。普通は「これとこれとこれに対応」と列挙するくらいが無難だと思います。


おっしゃるとおり、とても難しい条件に感じます。orz

上記条件については、アプリケーションの中で必要と思われるプログラム中のもので、
内容としてはSQLServerやOracleについてくるGUIツールによるデータエディタのようなものをおおよそ思いつくすべてのDBのために作成中です。Oracleのツールではrowidによる行の特定(where句にrowid)SQLServerのツールでは、どうやっているかはわかりませんが、複数行の更新はできないようです。

自分がやろうとしているのは変更したい値に対して、更新したところの色を変更してユーザーに知らせようとしているのですが、where句にその行のデータすべてを条件として含めても、同じ条件がほかの行であれば更新されてしまいます。そこで、ユーザーが更新行として意図しなかった値もひとまず、色を変えてユーザーに知らせるということをしなければならないのですが、どうにも特定の仕方が難しいのです。

更新された日時についてトリガーをするにしてもそのトリガーを別途用意しなければならないので、それをユーザ任せにはできず、また日時を入れたフィールドも用意できません。

たとえば

column

row1 a
row2 a
row3 b

とあった場合、ユーザーがrow1を変えたくてもrow2まで変わってしまいますがrow2が何行目なのかを特定しなくてはなりません。(変更前にソートされたとしても)
やはりユーザーが更新したデータと前のデータを取っておき、さらに、その条件データを取っておき、テーブル内を全件検索して、同じ値があればプログラム側で変えてしまうという方法以外ないんですかね。

#Update文ってこういうところが穴ですよね。どうにかならないものかと・・・
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2005-04-04 16:32
引用:

buttheadさんの書き込み (2005-04-04 16:27) より:
たとえば

column

row1 a
row2 a
row3 b

とあった場合、ユーザーがrow1を変えたくてもrow2まで変わってしまいますがrow2が何行目なのかを特定しなくてはなりません。(変更前にソートされたとしても)
やはりユーザーが更新したデータと前のデータを取っておき、さらに、その条件データを取っておき、テーブル内を全件検索して、同じ値があればプログラム側で変えてしまうという方法以外ないんですかね。

#Update文ってこういうところが穴ですよね。どうにかならないものかと・・・


るぱんです。

UPDATE文云々より、
WHERE句でレコードを一意にしていない事の方が問題なのでは?
butthead
大ベテラン
会議室デビュー日: 2004/01/14
投稿数: 162
投稿日時: 2005-04-04 16:39
>WHERE句でレコードを一意にしていない事の方が問題なのでは?
おっしゃるとおりですが、1列しか持たないテーブルの中で
aしかデータがない場合、

update table set column = 'c' where column = 'a';

しかできないと思うのですが、それ以外に方法はないものでしょうか。
VIM
ベテラン
会議室デビュー日: 2003/11/14
投稿数: 76
投稿日時: 2005-04-04 16:43
すでに各氏が指摘してますが、
【やりたいこと】
>変更したい値に対して、更新したところの色を変更してユーザーに知らせようとしている

【問題点】
>where句にその行のデータすべてを条件として含めても、同じ条件がほかの行であれば更新されてしまいます。

【現在の妥協点】
>そこで、ユーザーが更新行として意図しなかった値もひとまず、
>色を変えてユーザーに知らせるということをしなければならない

当初スレの問題となっていたのは、【現在の妥協点】の部分だと思います。

しかし、【やりたいこと】に対する【問題点】が解決すれば、
【現在の妥協点】の問題なんて、発生しないと思うのですが、どうでしょう?

その解決策が、各氏が言っている「レコードを一意に」です。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2005-04-04 16:52
1.ALTER TABLE使って項目を拡張して、
シーケンス番号で採番できるようにする。
(シーケンス番号=主キーの制約も課す)
(既存のデータに対しては上から連番を振って行く。)

2.実際にデータを突っ込む部分でシーケンス番号を
とるようにSQLを改造

3.今回の問題点のデータを参照する際に、シーケンス番号と一緒にとる

4.値を隠して保持しておいてWHERE句で指定してUPDATE

以上の4個の変更で直ると思われるがいかがでしょう?
butthead
大ベテラン
会議室デビュー日: 2004/01/14
投稿数: 162
投稿日時: 2005-04-04 16:52
要するに主キーが一つ以上ないテーブルでは、更新できないようにするというものですか。
妥協するとしたらやはりそうなりますかあ。残念。

ただ、「必ず主キーが存在するテーブル以外は更新できない」という制約がついてしまい、
rowidのようになにか隠れた一意に認識できる方法がDBそれぞれごとにあればいいんですが。

やっぱり無理なんですかねーー。

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