したがって、挿入されたコレクションと削除されたコレクションについて、トリガーで学習して使用する必要があります。あなたの現在のトリガーは、挿入と更新のたびに、テーブル全体で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トリガーと同様の操作を行います。
熟考するだけのアイディアです。
スキーマを転記する必要があります。テーブルの主キーは何ですか? – pmbAustin
このテーブルの主キーはProductIDです。 – SMD