goo blog サービス終了のお知らせ 

I Love DB

DBを愛する人のブログ

ROWIDはどこ

2010-06-01 16:34:11 | 開発サイドから見たOracleとSQL Server
「最初に学んだDataBaseがOracleだった」という方にとっては,ROWIDは必然的な存在に思えるかもしれません。しかし,これはOracleの実装であり,SQL ServerにはROWIDがありません。ですので,それぞれに応じた開発が必要になります。

固定値テーブルを以下のように作成したとします。本来は主キーがkey1,key2,key3に設定されますが,今は,キーを付けていない状態です。
Oracle
<style type="text/css">? </style>
0001 -- Create table
0002 create table TT_FIX_VALUE
0003 (
0004 KEY1 VARCHAR2(50),
0005 KEY2 VARCHAR2(50),
0006 KEY3 VARCHAR2(50),
0007 FIX_VALUE VARCHAR2(500)
0008 )

SQL Server
<style type="text/css"> </style>
0001 CREATE TABLE [dbo].[TTFixValue](
0002 [key1] [varchar](50) NULL,
0003 [key2] [varchar](50) NULL,
0004 [key3] [varchar](50) NULL,
0005 [fix_value] [varchar](500) NULL
0006 ) ON [PRIMARY]
さて,固定値をExcelのシート上に作成し,PL/SQL Developer,SQL Server Management Studioそれぞれを使いコピペしたとしましょう。PL/SQL Developerは,select t.*, rowid from TT_FIX_VALUE tを実行させ,空白の実行結果に対してexport to Excelのコンテキストメニューを使うことにより,ヘッダ部分のみのExcelシートを作成でき,便利です。

既に気づかれたかもしれませんが,4件目(Excel5行目)のデータは1件目と同じです。コピペ増殖させようとして変更漏れがあったと思ってください。これを作成した固定値テーブルに貼り付け登録します。どちらも登録ができます。さて,登録結果をセレクトして確認してみます。

ここで先ほどの変更漏れに気づいたとしましょう。Oracleは4レコード目をPL/SQL Developer上で変更し,反映-コミットをすれば修正が完了します。SQL Serverはどうでしょうか。

エラーメッセージを見るとSQL Server Management Studioが変更結果をUPDATEしようとしたものの,変更対象行が複数となるため,処理できないといっていることがわかります。こうなるとSQL Serverではお手上げです。UPDATEしようにも常に2行が同時に変更されるため,DELETEするしかありません。しかも,DELETEすると,1行目のレコードも削除されてしまうので,それも復元してやらねばなりません。
結論は何でしょうか。SQL Serverでは,主キーの設定が必須だということです。別にこれはSQL Serverが劣っているというわけではなく,通常のDBの仕様であるというだけです。このためにROWIDが存在しているわけではありませんが,ROWIDの実装とSQL上にROWIDを公開しているメリットは大きい,とも言えます。






コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。