2011-06-23 19 views
0

からBASETABLE上のトリガdoesntのトリガの新しいデータがBASETABLEに挿入されたとき、私はそれが別のテーブルにデータを挿入するためのビュー(InsteadView)のトリガーを作りたいです。それは私がビューに手動でデータを挿入するときだけ動作しますが、私はBasetableにデータを挿入しません。SQLベースの代わりにビュー

CREATE TABLE BaseTable 
    (PrimaryKey  int PRIMARY KEY IDENTITY(1,1), 
    Color   nvarchar(10) NOT NULL, 
    Material  nvarchar(10) NOT NULL, 
    ComputedCol AS (Color + Material) 
) 
GO 

--Create a view that contains all columns from the base table. 
CREATE VIEW InsteadView 
AS SELECT PrimaryKey, Color, Material, ComputedCol 
FROM BaseTable 
GO 

--Create an INSTEAD OF INSERT trigger on the view. 
CREATE TRIGGER InsteadTrigger on InsteadView 
INSTEAD OF INSERT 
AS 
BEGIN 
    --Build an INSERT statement ignoring inserted.PrimaryKey and 
    --inserted.ComputedCol. 
    INSERT INTO anotherTable 
     SELECT Color, Material 
     FROM inserted 
END 
GO 

INSERT INTO BASETABLE(カラー、 素材) VALUES(N'Red 'N'Cloth')

--view INSERT文の結果。 SELECT主キー、カラー、 素材、設計通りに働いている別のテーブル

+0

ビューのポイントは何ですか? –

+0

これは簡単な例です。実際のビューは15のテーブルから形成されています。これを働かせることができれば、本当のことに取り組むのに役立ちます。 – tdjfdjdj

答えて

3

FROM ComputedCol。あなたの問題をデータベース以外の言葉で再現するためには、「フロントドアノブに電化しましたが、バックドアを歩くときはいつでも、私がフロントドアに入るときにはショックを受けません。バックドアを開いたときに同じショックを受けることを希望している場合は、そのドアにも通電します。

トリガーはビューで定義されているため、データを挿入すると消えます。ベーステーブルには何も定義されていませんが、トリガーは発生しません。トリガーの代わりにトリガーを置くと、代替テーブルにデータがプッシュされますが、別の列を追加したり値に基づいて条件付きロジックを実行したりしない限り、データを取得することはありません。

+0

だから誰がトリガのInteadを使いたいのですか?私は自分のビューに手動でデータを挿入したくない。私は自分のベースセットが成長するときにサイズが大きくなるようにしたいし、各インサートでトリガーは別のテーブルに書き込みます。 – tdjfdjdj

+0

ベーステーブルが大きくなったときにあなたの見解が「成長する」ことを望むとはどういう意味ですか?ビューは単なる「保存された」クエリだけではありません。代わりにOfトリガは、オブジェクト(テーブル/ビュー)を変更する必要があるが、呼び出しコードのリファクタリングを心配したくない場合に便利です。呼び出し元とデータベース間の契約は有効ですが、カバーの下に置かれていると、トリガーはデータを古いものの代わりにNewTableにプッシュします。少なくとも、それは私がそれらを使用しなければならなかったシナリオです。私は、他のユースケースが異なると確信しています。 – billinkc

+0

ベーステーブルに20行がある場合、作成したビューには20行も含まれます。だから私は5つのテーブルを持っていると言うと、ビューは、彼らの行を結合します。また、いくつかのアルゴリズムが適用されます。今私はそのビュー内の新しいデータを新しいテーブルに書き込むことを望みます。なぜこれが重要であるのか、なぜすべてのインサートのビューからデータを取り出す必要があるのか​​分かりませんか? – tdjfdjdj

関連する問題