VIEW を経由した更新の考え方


  更新に使うべきでは無い

単一であろうが、複合であろうがそれはシステムを複雑にするたけでメリットは考えられません。基本表が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 を作成する事が良くあります。




yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[oracle]
CCBot/2.0 (https://commoncrawl.org/faq/)
19/06/25 16:27:39
InfoBoard Version 1.00 : Language=Perl

BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube