2

列の内容を同じテーブルの別の列にコピーしたいと考えています。したがって、このトリガーを作成しました。

ALTER TRIGGER [dbo].[kennscht_copy_to_prodverpt]
ON [dbo].[Stammdaten]
AFTER INSERT
AS
UPDATE Stammdaten
SET PRODVERPT = (SELECT KENNSCHT FROM INSERTED)
WHERE SNR = (SELECT SNR FROM INSERTED);

しかし、テーブルで UPDATE を使用KENNSCHTして別の値に更新すると、PRODVERPT更新されません。AFTER INSERTこれは、トリガーが onであり、 notであるためだと主張できますが、AFTER UPDATEそれを変更して and によってトリガーされるようにするUPDATEINSERT、行を更新するたびに、SQL Server からエラー メッセージが表示されます。

行が一意でなくなるか、複数の行(2行)を更新するため、行を更新できません[sic]

ここで何が起こっているのですか?トリガーが何もしないか、テーブル全体を台無しにして更新不能にしています。

更新:次のトリガーも試しました:

UPDATE s
SET s.PRODVERPT = i.KENNSCHT
FROM Stammdaten s
INNER JOIN INSERTED i ON i.SNR = s.SNR;

しかし、それはまったく同じ動作をします。のみを使用するAFTER INSERTと何も変化せず、使用するとAFTER INSERT, UPDATE上記のエラーメッセージが表示されます。

更新 2: テーブルに複数の行はありません。問題に関連している可能性があると考えたため、既に確認しました。

4

1 に答える 1

3

このトリガーをトリガーとして実行すると、AFTER UPDATE再帰的に実行されます。これは、同じテーブルに対して常に別の UPDATE ステートメントを発行し、トリガーの別の実行につながるためです。

これを回避するには、更新トリガーをトリガーにするか、列が変更されたINSTEAD OF UPDATEかどうかをテストする必要があります。KENNSCHT後者の場合、次のUPDATE()ような関数を使用できます。

ALTER TRIGGER [dbo].[kennscht_copy_to_prodverpt_after_update]
ON [dbo].[Stammdaten]
AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON
    IF (UPDATE(KENNSCHT))
    BEGIN
        UPDATE s
            SET s.PRODVERPT = i.KENNSCHT
            FROM Stammdaten s
            INNER JOIN INSERTED i ON i.SNR = s.SNR
    END
END
于 2013-09-10T09:59:53.237 に答える