1

単純なものでいっぱいになるテーブルアダプタがあります:SELECT * FROM [view]

テーブルアダプタを更新するか、新しい行を追加しようとしましたが、何も起こりません。私はたくさんのテーブルアダプタを持っていますが、すべてが1つのテーブルでいっぱいになるので、更新は問題になりません。しかし、現在、データを取得するためにビューを使用しているので、更新/挿入を行うことができません。

何か案が?

4

1 に答える 1

1

ビューが複数のテーブルで作成されているか、集計関数を持っているか、order by句またはunion句を持っている場合、それはビューが更新可能なビューではないことを意味します。このビューでは、挿入/削除/更新はサポートされません。

ビュー内の2つのテーブル間で結合しているため、更新可能なビューではありません。ビューは、単一のテーブルでのみ作成された場合にのみ更新されます。

次の条件が当てはまる限り、ビューを介して基になるベーステーブルのデータを変更できます。

UPDATE、INSERT、およびDELETEステートメントを含むすべての変更は、1つのベーステーブルからの列のみを参照する必要があります。ビューで変更される列は、テーブル列の基になるデータを直接参照する必要があります。次のような他の方法で列を導出することはできません。

  • 集計関数:AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR、およびVARP。
  • 計算。他の列を使用する式から列を計算することはできません。集合演算子UNION、UNION ALL、CROSSJOIN、EXCEPT、およびINTERSECTを使用して形成された列は、計算になり、更新もできません。

変更される列は、GROUP BY、HAVING、またはDISTINCT句の影響を受けません。TOPは、WITHCHECKOPTION句とともにビューのselect_statementのどこにも使用されません。

以前の制限は、ビュー自体に適用されるのと同じように、ビューのFROM句のサブクエリにも適用されます。一般に、データベースエンジンは、ビュー定義から1つのベーステーブルへの変更を明確にトレースできる必要があります。詳細については、「ビューを介したデータの変更」を参照してください。

以前の制限により、ビューを介してデータを直接変更できない場合は、次のオプションを検討してください。

トリガーの代わりに

ビューにINSTEADOFトリガーを作成して、ビューを更新可能にすることができます。トリガーが定義されているデータ変更ステートメントの代わりに、INSTEADOFトリガーが実行されます。このトリガーにより、ユーザーはデータ変更ステートメントを処理するために発生する必要のある一連のアクションを指定できます。したがって、特定のデータ変更ステートメント(INSERT、UPDATE、またはDELETE)のビューにINSTEAD OFトリガーが存在する場合、対応するビューはそのステートメントを介して更新可能です。

パーティションビュー

ビューがパーティション化されたビューの場合、ビューは更新可能ですが、特定の制限があります。必要に応じて、データベースエンジンは、ローカルパーティションビューを、参加しているすべてのテーブルとビューがSQL Serverの同じインスタンス上にあるビューとして区別し、分散パーティションビューを、ビュー内のテーブルの少なくとも1つが含まれるビューとして区別します。別のサーバーまたはリモートサーバーに存在します。

詳細については、このMSDNリンクを参照してください

于 2012-05-10T10:09:36.337 に答える