513094 ランダム
 ホーム | 日記 | プロフィール 【フォローする】 【ログイン】

Road to DBD

Road to DBD

【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! --/--
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

PR

カレンダー

カテゴリ

バックナンバー

2024.11
2024.10
2024.09
2024.08
2024.07

キーワードサーチ

▼キーワード検索

プロフィール

ジャムシード

ジャムシード

コメント新着

mayggW@ продвижение раскрутка сайта договор Заказать seo поисковую оптимизацию сайт…
通りすがりプログラマー@ Re:複数テーブルによるUPDATE(02/11) 随分前の記事にコメント失礼します。 rown…
ワンコ0995@ Re:包含データベース(06/02) ((データベース)データベース,)デー…
しぐしぐ@ Re:TOP 100 PERCENT(05/08) お世話になっております。 最近、旧システ…
ハニー@ Re:INSTEAD OFトリガの限界(07/16) 1SQLでやらずに変数に入れればいいじゃん
2008.07.16
XML
カテゴリ:DB-TransactSQL

複数のテーブルをJOINしたViewにINSTEAD OF INSERT, UPDATE, DELETEの各トリガを仕込み、あたかもテーブルのように使わせるというアプローチは実際には限界があることがわかった。
通常のINSERT, UPDATE, DELETEは問題なく動くが、以下のUPDATE文はエラーになる。
update joinview
set field1=b.fieldx,field2=b.fieldy
from joinview a
inner join valuestbl b on b.id=a.id

メッセージ 414、レベル 16、状態 1、行 3
UPDATE は許可されません。ステートメントにより、結合に参加していて、INSTEAD OF DELETE トリガを保持しているビュー "joinview" が更新されます。
(日本語のメッセージだけ、INSTEAD OF DELETEと間違えて表示されるのがまたなんともいえないが)

この更新を認めない理由はいくら眺めても「INSTEAD OFトリガ」の項には書かれていない。しかし、「UPDATE」の項にはひっそりと以下の記述があった。
>INSTEAD OF UPDATE トリガを伴うビューは、FROM 句を伴う UPDATE の対象にはなりません。
では、他のテーブルの値で更新することはできないのかというと、以下の更新はできる。

update joinview
set field1=(select fieldx from valuestbl where id=a.id),
    field2=(select fieldy from valuestbl where id=a.id)
from joinview a

JOINしてなければ、from句はあってもいいのか。。
Oracleで使える複数フィールドの一括更新の構文は使えないから、これでは煩雑だし、フィールドが増えてくるとパフォーマンス的にも心配だ。
一方、考え方を変えれば、結合更新のケースって、トランザクション処理ではほとんどのケースで回避できるのかもしれない、とも思う。あきらめるほどのこともないのか。。






お気に入りの記事を「いいね!」で応援しよう

最終更新日  2008.07.17 02:54:20
コメント(1) | コメントを書く
[DB-TransactSQL] カテゴリの最新記事



© Rakuten Group, Inc.
X