- - PR -
Updateで影響のあった更新行を知りたい!!
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2005-04-04 16:08
「意図しない更新」って、
Program-Aで更新したレコードを Program-Bで抽出したいってことじゃないの? # [Program]を[Process]で置き換えても良し。 私はそう考えてました。 | ||||
|
投稿日時: 2005-04-04 16:20
全てのDBに対応ってのはちょっと現実的じゃないような気がしますが
Oracle特有の機能は全く使わないって事ですよね 多大な労力使ってわかりにくいコードになって性能は低下 メンテしにくい他にもいろいろデメリットありそうですが それを上回るメリットがあるのかな? | ||||
|
投稿日時: 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文ってこういうところが穴ですよね。どうにかならないものかと・・・ | ||||
|
投稿日時: 2005-04-04 16:32
るぱんです。 UPDATE文云々より、 WHERE句でレコードを一意にしていない事の方が問題なのでは? | ||||
|
投稿日時: 2005-04-04 16:39
>WHERE句でレコードを一意にしていない事の方が問題なのでは?
おっしゃるとおりですが、1列しか持たないテーブルの中で aしかデータがない場合、 update table set column = 'c' where column = 'a'; しかできないと思うのですが、それ以外に方法はないものでしょうか。 | ||||
|
投稿日時: 2005-04-04 16:43
すでに各氏が指摘してますが、
【やりたいこと】 >変更したい値に対して、更新したところの色を変更してユーザーに知らせようとしている 【問題点】 >where句にその行のデータすべてを条件として含めても、同じ条件がほかの行であれば更新されてしまいます。 【現在の妥協点】 >そこで、ユーザーが更新行として意図しなかった値もひとまず、 >色を変えてユーザーに知らせるということをしなければならない 当初スレの問題となっていたのは、【現在の妥協点】の部分だと思います。 しかし、【やりたいこと】に対する【問題点】が解決すれば、 【現在の妥協点】の問題なんて、発生しないと思うのですが、どうでしょう? その解決策が、各氏が言っている「レコードを一意に」です。 | ||||
|
投稿日時: 2005-04-04 16:52
1.ALTER TABLE使って項目を拡張して、
シーケンス番号で採番できるようにする。 (シーケンス番号=主キーの制約も課す) (既存のデータに対しては上から連番を振って行く。) 2.実際にデータを突っ込む部分でシーケンス番号を とるようにSQLを改造 3.今回の問題点のデータを参照する際に、シーケンス番号と一緒にとる 4.値を隠して保持しておいてWHERE句で指定してUPDATE 以上の4個の変更で直ると思われるがいかがでしょう? | ||||
|
投稿日時: 2005-04-04 16:52
要するに主キーが一つ以上ないテーブルでは、更新できないようにするというものですか。
妥協するとしたらやはりそうなりますかあ。残念。 ただ、「必ず主キーが存在するテーブル以外は更新できない」という制約がついてしまい、 rowidのようになにか隠れた一意に認識できる方法がDBそれぞれごとにあればいいんですが。 やっぱり無理なんですかねーー。 | ||||
