web-dev-qa-db-ja.com

結合されたテーブルを含むSQL更新可能ビュー

私はこれに似た見方をしています、

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のフィールドのみを更新できることを意味します(これは現在達成できるすべてです)。このコンテキストでは、「ベーステーブル」の定義はその後に結合されるテーブルに拡張されませんか?

16
Red Taz

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.
15
Mikael Eriksson

更新可能な結合ビューのルールは次のとおりです。

一般規則

結合ビューでの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

5
Nathan Q

StaffStaffId 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

これにより、データを削除してその制限を回避することができました。

0
Daniel H