私はこれに似た見方をしています、
SELECT dbo.Staff.StaffId, dbo.Staff.StaffName, dbo.StaffPreferences.filter_type
FROM dbo.Staff LEFT OUTER JOIN
dbo.StaffPreferences ON dbo.Staff.StaffId = dbo.StaffPreferences.StaffId
を使用してStaffPreferences.filter_type
を更新しようとしています。
UPDATE vw_Staff SET filter_type=1 WHERE StaffId=25
私はこれをMSDNの記事で読みました。
UPDATE、INSERT、およびDELETEステートメントを含むすべての変更は、1つのベーステーブルからの列のみを参照する必要があります。
これは、dbo.Staffのフィールドのみを更新できることを意味します(これは現在達成できるすべてです)。このコンテキストでは、「ベーステーブル」の定義はその後に結合されるテーブルに拡張されませんか?
1つのテーブル(StaffPreferences
)から列を変更するだけなので、ステートメントは問題なく機能するはずです。
同じ更新ステートメントで異なるテーブルの列を更新しようとすると、エラーが発生します。
Msg 4405, Level 16, State 1, Line 7
View or function 'v_ViewName' is not updatable because the modification affects multiple base tables.
更新可能な結合ビューのルールは次のとおりです。
一般規則
結合ビューでのINSERT、UPDATE、またはDELETE操作は、一度に1つの基になるベーステーブルのみを変更できます。
UPDATEルール結合ビューの更新可能なすべての列は、キーが保持されたテーブルの列にマップする必要があります。キー保存テーブルの説明については、「キー保存テーブル」を参照してください。ビューがWITHCHECK OPTION句で定義されている場合、すべての結合列と繰り返されるテーブルのすべての列は更新できません。
DELETEルール
結合にキーが保持されたテーブルが1つだけある限り、結合ビューの行を削除できます。ビューがWITHCHECK OPTION句で定義され、キー保存テーブルが繰り返される場合、行をビューから削除することはできません。
INSERTルールINSERTステートメントは、キーが保持されていないテーブルの列を明示的または暗黙的に参照してはなりません。結合ビューがWITHCHECK OPTION句で定義されている場合、INSERTステートメントは許可されません。
http://download.Oracle.com/docs/cd/B10501_01/server.920/a96521/views.htm#391
Staff
にStaffId
25の行があるが、StaffPreferences
に一致する行がない場合に、発生する可能性のある問題のいくつかを確認できると思います。実行できるさまざまな正しいことがあります(これがテーブルであるかの外観を保持する、StaffPreferences
に挿入を実行する、更新を拒否するなど)。
この時点で、SQL Serverエンジンはあきらめ、必要な動作を実装するトリガーを作成する必要があると思います(それが何であれ。結合が機能する/機能しないすべてのケースを考慮する必要があります。 )
これが私がそれを解決した方法です。
私の場合、それはビューではなくテーブルでしたが、参照テーブルのデータ構築でテーブルを参照するスキーマIDを見つける必要がありました。たとえばour_schema
。
私は以下を実行しました:
select schemaid from our_schema where name = "MY:Form"
これにより、IDは778になりました(例)
次に、このIDがT、B、またはHのプレフィックスで表示されている場所を調べました。
この場合、データが格納されるテーブル、ベース、および履歴テーブルがあります。
それから私は走った:
delete from T778
delete from B778
delete from H778
これにより、データを削除してその制限を回避することができました。