- PR -

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

投稿者投稿内容
butthead
大ベテラン
会議室デビュー日: 2004/01/14
投稿数: 162
投稿日時: 2005-04-04 17:07
> 1.ALTER TABLE使って項目を拡張して、
>シーケンス番号で採番できるようにする。
>(シーケンス番号=主キーの制約も課す)
>(既存のデータに対しては上から連番を振って行く。)

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

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

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

>以上の4個の変更で直ると思われるがいかがでしょう?

お早いご回答ありがとうございます。
しかしながら、ユーザ側が自分で作ったテーブルをこちらのプログラムで操作し、alterして主キーを用意することにやや抵抗があります。
またいつかの段階で、シーケンス番号列を削除することが必要になります。

一度select count して重なる行数が2行以上であれば、
やはり全件検索を発動して同じ条件となる値をすべて検索していき何行目にあるかを調べなければならないでしょうか。かなり面倒でパフォーマンスも下がりそうですが。


るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2005-04-04 17:26
引用:

buttheadさんの書き込み (2005-04-04 17:07) より:
お早いご回答ありがとうございます。
しかしながら、ユーザ側が自分で作ったテーブルをこちらのプログラムで操作し、alterして主キーを用意することにやや抵抗があります。
またいつかの段階で、シーケンス番号列を削除することが必要になります。

一度select count して重なる行数が2行以上であれば、
やはり全件検索を発動して同じ条件となる値をすべて検索していき何行目にあるかを調べなければならないでしょうか。かなり面倒でパフォーマンスも下がりそうですが。


顧客が作ったテーブルならば、
顧客にその旨を「営業と一緒に」申し出て
予算を追加でもらってから作業を進めるのがセオリーだと思いますが?

プログラム中にALTER TABLEかますのは愚の骨頂と思うのですが・・・?

顧客が中途半端なもの作ったことを言い訳にするのではなく、
「どうやったらできるようになる」と提案するのがSEの職務と思いますが?
_________________
MINE
会議室デビュー日: 2003/07/02
投稿数: 17
投稿日時: 2005-04-04 18:02
「データを一意に判別する条件がない」テーブルで、
まったく同じデータのレコードが複数存在することに
どのような意味があるのかがわかりません。
このようなテーブルの存在意義はなんなのでしょうか。
また、この一意性のないデータについて、同じ情報を同時に更新されるのが
問題ということですが、これらの同じデータをどのように区別し、
他のテーブルとリレーションを取っているのかを知りたいです。

また、仮にアクセスするテーブルの構造が開発者からわからない。
たとえば、オブジェクトブラウザのようなDBアクセスツールを
作成していて、ユーザが自作のスキーマへアクセスし、特定のレコードを
変更した際に、主キー設定がされてなく、同時に対象外のレコードが変更
されてしまうのが問題だというのであれば、そのテーブルに主キーがないこと
自体に設計上の問題があると思うので、そういう場合は、エラーとするのが
正解だと思うのですがいかがでしょうか。

[ メッセージ編集済み 編集者: MINE 編集日時 2005-04-04 18:10 ]
butthead
大ベテラン
会議室デビュー日: 2004/01/14
投稿数: 162
投稿日時: 2005-04-04 18:10
>顧客が作ったテーブルならば、
>顧客にその旨を「営業と一緒に」申し出て
>予算を追加でもらってから作業を進めるのがセオリーだと思いますが?

>プログラム中にALTER TABLEかますのは愚の骨頂と思うのですが・・・?

>顧客が中途半端なもの作ったことを言い訳にするのではなく、
>「どうやったらできるようになる」と提案するのがSEの職務と思いますが?

いささか誤解を招いたようで申し訳ありません。

自分が対応しているのはパッケージ物なので、ユーザーがどのようなテーブル
、ビューを扱うかについては現時点でわかりません。

当然ながら対応するテーブルに対して変更を加えるなどもってのほかです。

現状与えられた条件として

1 すぐに他のDBに対応できるようコードに余地を残す。
2 たとえ、どのようなテーブルでも更新できるようにする。

という上記2点は絶対だと考えます。
なので、質問した感じですと、やはり早々答えは見つからないという感じでしたので、
ひとまず先ほどあげた全件検索かrowidにてOracleのみ対応し、他のDBについては
rowidに変わるものがあればそれを使うということで解決したいと思います。

他のDBはDB2,SQLserver,postgres,informix,sybaseなどやっていきますのでそれらについてわかったときにはまたご報告いたします。

以上ありがとうございました。
nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2005-04-04 18:55
こんにちは。

2005-04-04 18:10
>自分が対応しているのはパッケージ物なので、ユーザーがどのようなテーブル、ビューを扱うかについては現時点でわかりません。
2005-04-04 16:27
>SQLServerやOracleについてくるGUIツールによるデータエディタのようなもの

作りたいのは、「どのようなDBにも対応できるデータエディタ」という単独のツールですよね。
(途中、他の方が顧客やSEという言葉を使ったのであれ?って思っちゃいました)

ツールとしては、テーブルのデータをグリッド形式で一覧表示し、その内容をメンテするようなものをイメージしました。

で、引っかかるのが「1列しかなく、キーが無いテーブルで、同じ内容のレコードが複数あった場合、画面上でメンテした行が、DB上のどの行か特定するのが難しい」と。それも標準のSQLの範囲内でやりたいと。

たぶん、無理です。
テーブルの行を特定するのは、そのDBのアーキテクチャに依存してしまうと思われます。
自分はSQLServerしか知りませんが、Oracleのrowidに似たような行識別子(RID)というものを持っているようです。しかし、RIDをSQL文で操作したり特定したりはできないようです。(ヘルプを検索してみた限りですが。もしかしたらできるのかも)

行を管理する仕組みがDB毎に違うと思いますので、作ろうと思っているツールは制限が発生するでしょう。

ちなみにSQL Server付属のEnterprise Managerで同じことをやろうとすると、「キー列の情報が足りないか、正しくありません。更新の影響を受ける行が多すぎます。」というエラーメッセージが表示され、メンテできません。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-04-06 16:59
単純に技術的興味から、RDBMS を限定した場合に何らかの方策はあるのかと思い、手元の「SQL クイックリファレンス」(原題 SQL in a Nutshell、Kline K. & Kline D. 著、石井 & 宮原監訳、オライリー・ジャパン発行、ISBN 4-87311-055-6)を調べてみました。

注意書きとして「UPDATE 文を実行する前に同じ WHERE 句を使った SELECT 文を実行してみることを推奨する」とありました

(1) MySQL
独自の LIMIT 句があり、自然数を引数に与えて更新される行数の上限を指定できます。
ただし、例え LIMIT 1 と指定しても、1 行だけ更新されたのが意図したものかそうでないかは MySQL サーバにはわかる由もありません。
テーブル管理上で最初に該当したものが更新されるだけです。

(2) Oracle
DELETE と UPDATE に RETURNING 句があり、それぞれ削除/更新された行が複数ある場合、それをバインド配列に格納する機能を持っています。

(3) Microsoft SQL Server と Oracle
WHERE 句に WHERE CURRENT OF というバリエーションがあり、対象テーブル上のカーソルが指す行を 1 行だけ更新できます。
これらの RDBMS に付属するデータエディタは、この機能を使っているのかもしれません。
(一切確証はありません(_ _))

# まるっきり SQL99 に沿った機能しか持たない PostgreSQL でこういうエディタが
# 作れるかと考えてみましたが、やはり行 ID に相当するカラムを明示的に入れて
# おかないと果てしなく無理と感じました。
## 私の頭が弱いだけだったらどうしよう... orz
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-04-06 17:28
UPDATEする時のWHERE分にテーブルの全てのフィールドを条件として記述する。もし2行以上更新されていたら警告する・・・とか?

あるいはテーブル定義を取得して、プライマリキーの情報を獲得。プライマリキーが指定されていない時には、更新不可・・・とか?

#ちなみにこれは、MS-ACCESSのマネだけどね・・・

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