2016-10-12 4 views
0

特定の列に挿入された特定の値を別の特定の値に置き換えるトリガーを作成しようとしています。挿入後にnullを特定の値に置き換えるトリガーを作成する

Ex。 '1'が挿入されるたびに、 '2'は挿入と更新の後にその場所を取ります。

このトリガは、挿入された、むしろちょうど新しい行よりも新しい挿入後に「2」をカラムの下にすべての行を更新し終わる:

CREATE TRIGGER trg_MakeFlag 
ON Production.Product 
AFTER INSERT, UPDATE AS 
    BEGIN 
    UPDATE Production.Product 
    SET MakeFlag = '2' 
    WHERE MakeFlag = '1' 
END 

任意の助けが理解されます。

+0

スキーマを転記する必要があります。テーブルの主キーは何ですか? – pmbAustin

+0

このテーブルの主キーはProductIDです。 – SMD

答えて

0

したがって、挿入されたコレクションと削除されたコレクションについて、トリガーで学習して使用する必要があります。あなたの現在のトリガーは、挿入と更新のたびに、テーブル全体でALL MakeFlagの値を2に設定します。あなたが「影響を受ける行」だけに制限するところはありません。

だから、本当に多くのこのような何か必要があります:あなたは(更新後に挿入された行、または「更新後」の値です)に挿入されたコレクションを使用して、テーブルに参加している。ここ

CREATE TRIGGER trg_MakeFlag 
ON Production.Product 
AFTER INSERT, UPDATE AS 
    BEGIN 
    UPDATE p 
     SET MakeFlag = '2' 
     FROM Production.Product p 
      INNER JOIN inserted i ON p.ProductID = i.ProductID 
    WHERE MakeFlag = '1' 
END 

をすべての行ではなく、特定の行にのみ影響します。

もちろん、ここでも問題があります。あなたは、特定のテーブルの更新後に起動するトリガを持っています。それは、そのテーブルを更新します。これは、私に再帰的に聞こえるものです。おそらくベストアイデアではないでしょう。

2つのINSTEAD OFトリガー(挿入用と1つは更新用)を作成すると、基本的に挿入されたコレクションのINSERTまたはUPDATEが行われ、1つの列が2の場合は1 CASEステートメントを使用して)。

これは次のようになります。

CREATE TRIGGER trg_MakeFlag 
ON Production.Product 
AFTER INSERT AS 
BEGIN 
    INSERT INTO Production.Product (ProductID, MakeFlag, column3, column4, etc...) 
     SELECT ProductID, 
       CASE WHEN i.MakeFlag = 1 THEN 2 ELSE i.MakeFlag END, 
       column3, 
       column4, 
       ... 
      FROM inserted; 
END 

あなたは(COLUMN3、column4、など....の代わりに、そこに本当の名前を入れて)すべての列を一覧表示しなければならないと確認してくださいSELECT FROMを挿入した同じ順序で同じ列をすべて選択します。 CASE文は、すべての1を2に変換するというマジックを行いますが、他のすべての値はそのままにします。

INSTEAD OF UPDATEトリガーと同様の操作を行います。

熟考するだけのアイディアです。

+0

ありがとう!これは非常に役に立ちました。 – SMD

+0

それをあなたの答えとしてください。ありがとうございました。 – pmbAustin

関連する問題