web-dev-qa-db-ja.com

ビューに更新クエリと削除クエリを記述できますか?

SQL Server 2005では、SELECTステートメントを使用して作成されたビューがいくつかあります。ビューにUPDATEおよびDELETEステートメントを記述できますか?

11
Surya sasidhar

それがあなたが求めているものであれば、ビューから削除することはできますが、情報を削除するビューを持つことはできません。ビューは、基になるテーブルのデータの一部です。権限がある場合は、テーブルに対して直接実行できるのと同じデータ操作をビューで実行できます。

したがって、次のようなことができます。

DELETE FROM my_View WHERE id = 3;

ビューを使用する場合
ビューとは

13
kemiller2002

このMSDNの記事から: ビューを介したデータの変更

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

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

  • WITH CHECK OPTIONも指定されている場合、TOPはビューのselect_statementのどこにも使用できません。

残りの記事を参照してください...

フォローするとどうなりますか

Create view table1_View 
as 
   select * 
   from table1 

go 

delete 
from table1_view

チェックしたところ、このコマンドはtable1からすべてのデータを削除しました

3
Subhash

**

ビューを使用したデータの更新:

**ビューは、データを更新するクエリで使用できますが、いくつかの制限があります。ビューはテーブルではなく、データが含まれていないことに注意してください。実際の変更は常にテーブルレベルで行われます。ビューは、基本テーブルで定義されている制約、ルール、または参照整合性をオーバーライドするメカニズムとして使用することはできません。

ビューを介したデータ更新の制限次の制限に従って、ビューの行を挿入、更新、および削除できます。

ビューに複数のテーブル間の結合が含まれている場合、ビューに挿入および更新できるのは1つのテーブルのみであり、行を削除することはできません。

ユニオンクエリに基づいてビューのデータを直接変更することはできません。 GROUP BYまたはDISTINCTステートメントを使用するビューのデータは変更できません。

変更されるすべての列には、ステートメントがベーステーブルに対して直接実行されている場合と同じ制限が適用されます。

テキストと画像の列は、ビューを介して変更することはできません。

ビュー基準のチェックはありません。たとえば、ビューでパリに住むすべての顧客が選択され、City = 'Paris'を持たない行を追加または編集するようにデータが変更された場合、データはベーステーブルで変更されますが、ビューには表示されません。 、ビューを定義するときにWITH CHECKOPTIONが使用されていない限り。詳細についてはこれを確認してください 記事

2
Srikanth

ビュー自体で許可されている制限付きの更新に加えて、INSTEAD OFトリガーを使用して、より複雑な変更を実行できます。 INSTEAD OFを使用すると、基本的に更新または削除をインターセプトし、ほとんどすべての変更を実行できます。参照: MSDN記事

1
Ken Redler

Srinivasの詳細な説明は、の点で答えます。

UPDATE、INSERT、およびDELETEステートメントを含むすべての変更は、1つのベーステーブルからの列のみを参照する必要があります。

ベーステーブル構造を管理できる限り、トリガーのINSTEAD OFを使用してこれを回避する方法があります。 INSTEAD OFトリガーを使用すると、ビューに対するINSERT、UPDATE、またはDELETE操作をオーバーライドできます。たとえば、ビューにINSTEAD OF INSERTトリガーを定義して、標準のINSERTステートメントを置き換えることができます。

以下のビューを作成したと仮定します。

CREATE VIEW AuthorsNames

AS

SELECT au_id, au_fname, au_lname

FROM authors 

ビューに表示されていない列にデータを挿入したい場合があります。これを行うには、挿入を処理するためにビューにINSTEADOFトリガーを作成します。

CREATE TRIGGER ShowInsert on AuthorsNames

INSTEAD OF INSERT

AS

BEGIN

INSERT INTO authors

   SELECT address, au_fname, au_id, au_lname, city, contract, phone, state, Zip

   FROM inserted

END

この方法を使用すると、複数のテーブルに挿入できますが、基になるテーブルを多数処理する場合、これはより複雑になります。 MSDNを参照

1
Priyankara

答えは、ビューが更新可能なビューであるか、更新不可能なビューであるかによって決まります。

更新可能なビューは、基になるテーブルのnull以外のすべての列を含むビューです。

その場合、ビューでのur update、delete、insertクエリは、基になる実テーブルのデータに影響します。

それでおしまい .....

0
Manu Sanju