VIEW を経由した更新の考え方
Google
Twitter
OneDrive
jQuery
Three.js
logicalerror
更新履歴
データベース
VBScript
更新に使うべきでは無い
単一であろうが、複合であろうがそれはシステムを複雑にするたけでメリットは考えられません。基本表が2つしか無いシステムならば話は別ですが、通常多くの基本表がそれぞれ意味があって設計されているのに、わざわざ更新系を複雑にする仕様を追加するようなものです。素人が作ったAccess のシステムでは良く見かけますが、後からメンテナンスする者はたまったものではありません。
SQLの特性上、更新を考えた場合 VIEW によるメリットは全体の見通しの良さを犠牲にする理由は全くありません。もちろん、Oracle マスターの試験には出て来るので、その特性は知っておくべきですが・・・
更新可能か不可能かを見分ける基本的な考え方
SQL はあまりにも優れている為、初心者には解りにくくなっていますが、検索の結果には二通りあります。それは、データベースにあるデータをそのまま取り出しているか、あるいは加工しているかという違いです。
システム開発に携わった者であればだいたいの想像は付くはずですが、設計はほとんどその
「加工」
に意味があります。最低限必要なデータをテーブルに収め、最終的にエンドユーザが必要とする形に加工する事に全てを費やしていると言っても過言ではありません。ですから、GROUP BY や、ORDER BY は明らかに
「加工」
だと気が付きます。
そもそも、データベース上のデータが勝手にソートされたり、勝手にグループ化されたりするはずがありません。データベースシステムが内部的に行なっているたけであって、実際に一時領域等で加工され、結果として戻されます。SQL の記述はその結果を得る為の手続きなのです。
もっと具体的に言えば、複数行が1行に変化するものは
「加工」
です。そういう意味では当然 DISTINCT キーワードも加工用のキーワードです。
ROWNUM 擬似列も、使用目的や結果から言えば
「加工」
の為にあります。Oracle ではこれが含まれる VIEW は無条件に更新不能となります。
式を含んだ VIEW
これには、多少の誤解があるように思います。これは、特定の列に対する
「加工」
である為、当然実体は無いので、その列に対する更新はできません。C での表現を借りれば、通常の列は 左辺値、つまりメモリそのものを表す代入可能なものです。しかし、右辺値となるものには代入はできません。
VIEW にこのような列が含まれていても、他の列を更新する事は可能です。その列を避けさえすれば、DML は発行できます。
唯一気をつけなければならないのは、VIEW で選択されていない列に制約がある場合です。選択されていない以上、追加時には NULL がセットされる事となります。それが制約に違反すれば、当然追加はできない事となります。
WITH CHECK OPTION と WITH READ ONLY
設計者が、どうしても必要にせまられてエンドユーザに対する更新インターフェイスを作る必要が出て来た時に、データの整合性を守るために WITH CHECK OPTION を使用します。これは、WHERE 句と連動してデータの更新ミスを防ぎます。しかし、これは SQL インターフェイス用であると思われる為、特殊な場合に用いられると思われます。通常はアプリケーションとして完全なチェックを行なうべきです。
WITH READ ONLY も、SQLインターフェイスのユーザに対する更新のリスクを無くす為であると思われます。アプリケーションであれば、VIEW に対して更新コードさえ書かなければ(そういう仕様がなければ)必要ありません。本来は、
「権限」
でコントロールすべきものでしょう。
複合ビュー
さすがに、これは Oracle マスター試験にも出ないようです。もし、このようなビューを使用した更新仕様が存在した場合、仕様変更時のリスクを考えただけで恐ろしくなります
本来の使い方
VIEW は非常に強力な機能です。乱用するべきではありませんが、プログラマの工数を削減する為の効果的な方法論であり、設計自身も簡素化され、わかりやすくなります。
ただ、問い合わせや印刷データの抽出に使用される SQL は、だいたいにおいて条件が複雑になる為、本来設計者がそれを踏まえて事前に VIEW の設計をするべきですが、実際はなかなかそういうわけには行かないのが実情です。結果的に必要に迫られて後から作成する事が多くなりますが、それだけに扱いには慎重になるべきでしょう。
例外は、運用時の目的に特化された処理です。その場合には、その時だけ必要な VIEW を作成する事が良くあります。
infoboard
管理者用
ツイート
フリーフォントWEBサービス
フリーフォントで簡単ロゴ作成
アイコン・はんこ画像作成
フリーフォントで横書きロゴ作成
フリーフォントで縦書きロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し素材作成
フリーフォントで PDF 作成
デュアルフォント
書体見本
フリーフォント配布サイト
キーボード画像作成
フリーフォント ギャラリー
イラストACよりフリーダウンロード
UTF-8文字Tool
SQLの窓WEBサービス
リアルタイムHTML
テキスト変換
ストリートビューとMAPのコード
SyntaxHighlighter
Shadowbox 埋め込みコード作成
SQLの窓フリーソフト
SQLの窓 Build C++
販売管理B
「送る」に入れる簡易ダンプ
WMI Query
コンピュータアイコンメニュー
ドメイン内検索
素材
足成
Image * After
ぱくたそ
イラストAC
イラスト素材サイト
一般WEBツールリンク
WEB アーカイブ
疑わしいファイルや URL を分析する
HTML整形ツール
JSONLint
ttf to woff converter
Run Code
Twitter Card validator
Google URL Shortener
C#<->VB.NET
SQLの窓
logical error
GINPRO
WAHA land
職人的フリーソフトの使い方
WEB 職人
ソース掲示板
フリーソフト
7-Zip
FileZilla
PrimoPDF(英語版)
GifCam
GIMP Portable
Classic Shell
JSライブラリ
jQuery
Lightbox
Shadowbox.js
The Google Hosted Libraries
cdnjs
Three.js