なので、簡単にノートします。これからどんどん書き込んでいきます。
- First, create a view that uses the WITH SCHEMABINDING option which binds the view to the schema of the underlying tables.
- Second, create a unique clustered index on the view. This materializes the view.
【Updatable View】
The WITH CHECK OPTION clause is used for an updatable view to prohibits the changes to the view that would produce rows which are not included in the defining query. The following statement creates a view that has rows meet the condition of the WHERE clause.
Updating Updateable Views Using User-Defined Inline Functions←こやつがUpdatable Viewとしたら、
The rules for updating user-defined inline functions are the same as they are for views.
Using INSTEAD OF Triggers to Update Non-Updateable Views←もしやこやつがIndexed Viewなのでは???
An INSTEAD OF trigger on a view allows you to get around many of the restrictions on updating views. For example, only one table in a view with multiple joined tables can be updated. An INSTEAD OF trigger can support inserts, updates, and deletes that reference data in more than one table. INSTEAD OF triggers also allow you to code more complex logic than is normally supported in views; and they let you work with time stamp data, computed columns, and identity columns.
【さっさとわかりたい方はこちらからお読みください。そして自己責任で理解するよう努めてください。すみません。。。】
ここにとってもよい情報がのってたけど、このIndexed viewとUpdatable viewの書き分けがされてないから、明日きちんと読みます。
読みました。(二日後)ついでにこちらも合わせて読みました。
https://www.mssqltips.com/sqlservertip/5984/sql-server-trigger-on-view-example/
http://www.informit.com/articles/article.aspx?p=130855&seqNum=4
https://sqlstudies.com/2014/08/06/schemabinding-what-why/
【種類】
Viewを使ってDELTE以外の更新ができるもの➡『Updatable View』
Viewを使って更新ができないもの➡『Non-Updatable View』
【条件】
『Non-Updatable View』
- Any DML statement, must reference columns from only one base table.
- The columns being modified in the view have to directly reference the underlying table columns. As a consequence, the view’s columns being modified cannot be the result of an aggregate function or a computed column.
- Additionally, the columns being modified cannot be affected by GROUP BY, HAVING, or DISTINCT clauses.
- The view’s code must not use the TOP clause together with the WITH CHECK OPTION clause.
- DMLステートメントは、1つのベーステーブルのみから列を参照する必要があります。
- ビューで変更される列は、基になるテーブル列を直接参照する必要があります。 結果として、変更されるビューの列は、集計関数または計算列の結果であってはなりません。
- また、変更される列は、GROUP BY、HAVING、またはDISTINCT句の影響を受けません。
- ビューのコードでは、TOP句とWITH CHECK OPTION句を併用しないでください。
【必要なもの】
『Non-Updatable View』-上記にある『GroupBy』や『Having』なんかを使ってあるView以外にも、パフォーマンスをあげる『Indexed View』なんかはこれに当たります。『Indexed View』に必要なものは『WITH SCHEMABIND』と『Unique Clustered Index』です。これらはリード・オンリーです。通常更新させるために使いません。まぁ、VIEWそのものが更新のためにないものね。
『Schemabinding isn’t a commonly used tool unless you are setting up an indexed view and then it can get lost in the crowd of other required restrictions. It does have uses outside of indexed views however. I could see using it if there is a mission critical view/function that just CAN’T break. By including the SCHEMABINDING clause you protect the view/function from unexpected changes to the tables underneath them. 』『スキーマバインドは、インデックス付きビューをセットアップしない限り、一般的に使用されるツールではありません。そうすると、他の必要な制限の群れで失われる可能性があります。 ただし、インデックス付きビュー以外でも使用できます。 壊れることのないミッションクリティカルなビュー/機能がある場合、それを使用して見ることができます。 SCHEMABINDING句を含めることにより、ビュー/関数をその下のテーブルへの予期しない変更から保護します。』https://sqlstudies.com/2014/08/06/schemabinding-what-why/
でもどうしても更新したいっ!っていう場合には『INSTEAD OF trigger』を使います。
『The only way to make data changes on a non-updateable view is by using INSTEAD OF triggers. This way you can use procedural code to overcome the limitation.』『更新不可のビューでデータを変更する唯一の方法は、INSTEAD OFトリガーを使用することです。 この方法で、手続き型コードを使用して制限を克服できます。 』https://www.mssqltips.com/sqlservertip/5984/sql-server-trigger-on-view-example/
『Updatable View』-Viewは本来直接データにアクセスして更新させるものではありません。ところが、SQLサーバにはなぜかこんな機能が充実されています。今後使っていくうちになぜだかわかることでしょう。。。
まず、『WITH CHECK OPTION』が更新された内容を親テーブルから確認させるために必要です。そして、『InlineUDF』を使った更新も可能です。おぅっ?!Fanctionでは更新できなかったはずなんやけど。。。でも『SELECT』が一つだけの場合、『Updatable Function』ってなるらしいです。(こちらから…もう、わからん。)➡ありました。。。以下をご覧ください。
『Change data is made available to change data capture consumers through table-valued functions (TVFs).』『変更データは、テーブル値関数(TVF)を介してデータキャプチャコンシューマを変更するために利用可能になります。』
では、余談ですがこんな問題があります。
You need to implement the following auditing rules for the Employees table:
– Record any changes that are made to the data in the Employees table.
– Customize the data recorded by the audit operations.
Solution: You implement a user-defined function on the Employees table.
Does the solution meet the goal?
Employeesテーブルに次の監査ルールを実装する必要があります。
– Employeesテーブルのデータに加えられた変更を記録します。
–監査操作によって記録されたデータをカスタマイズします。
解決策:Employeesテーブルにユーザー定義関数を実装します。
ソリューションは目標を達成していますか?
A.yes
B.No
ねこの答えはのーっでした。なぜなら、「by the audit operations」とかいてあったので、監査関係のデータをとるにはDMLトリガーが一番だと思ったからです。
こちらのサイトに処諸々の意見が交換されてます。
http://www.briefmenow.org/microsoft/does-the-solution-meet-the-goal-29/
※コメント投稿者のブログIDはブログ作成者のみに通知されます