16

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

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

4

4 に答える 4

16

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.
于 2011-09-02T09:17:53.037 に答える
5

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

原則

結合ビューでのINSERT、UPDATE、またはDELETE操作は、一度に1つの基礎となるベーステーブルのみを変更できます。

UPDATEルール 結合ビューの更新可能なすべての列は、キーが保持されたテーブルの列にマップする必要があります。キー保存テーブルの説明については、「キー保存テーブル」を参照してください。ビューがWITHCHECKOPTION句で定義されている場合、すべての結合列と繰り返されるテーブルのすべての列は更新できません。

削除ルール

結合にキー保存テーブルが1つだけある限り、結合ビューの行を削除できます。ビューがWITHCHECKOPTION句で定義されていて、キー保存テーブルが繰り返されている場合、行をビューから削除することはできません。

INSERTルール INSERTステートメントは、キーが保持されていないテーブルの列を明示的または暗黙的に参照してはなりません。結合ビューがWITHCHECKOPTION節で定義されている場合、INSERTステートメントは許可されません。

http://download.oracle.com/docs/cd/B10501_01/server.920/a96521/views.htm#391

于 2011-09-02T08:48:04.183 に答える
0

Staff25の行があるStaffIdが、に一致する行がない場合に発生する可能性のある問題のいくつかを確認できると思いますStaffPreferences。実行できるさまざまな正しいことがあります(これがテーブルであるかの外観を保持する、挿入を実行するStaffPreferences、更新を拒否するなど)。

この時点で、SQL Serverエンジンはあきらめ、必要な動作を実装するトリガーを作成する必要があると思います(それが何であれ。結合が機能する/機能しない場合のすべてのケースを考慮する必要があります。 )。

于 2011-09-02T09:19:48.483 に答える
-1

これが私がそれを解決した方法です。

私の場合、それはビューではなくテーブルでしたが、参照テーブルのデータ構築でテーブルを参照するスキーマ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

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

于 2015-06-05T18:39:05.720 に答える