0

トリガーの完全な初心者...すべてのドキュメントは初心者のものを気にしません。

更新された行を更新したいだけです。以下のトリガーは、テーブル全体を更新します。以下のトリガーは、2 つの列の変更をテストするだけです。

この更新トリガーをテーブル全体ではなく、更新された行のみの更新に制限するにはどうすればよいですか?

ALTER TRIGGER [dbo].[geog_update] ON [dbo].[Site]
FOR UPDATE
AS
SET NOCOUNT ON
IF (UPDATE(Latitude) OR UPDATE(Longitude))
BEGIN
    UPDATE Site
    SET geog = geography::Point([Latitude], [Longitude], 4326)
    WHERE Latitude is not null and Longitude is not null
END

FOR UPDATE、INSERT を使用するだけで、挿入された行に同じトリガーを使用できますか? INSERT が UPDATE を意味しない限り、IF は列の UPDATE() をチェックするため、おそらくそうではありません。

4

2 に答える 2

1

まず、どのような状況でも、SQL Server で 1 行だけを更新するトリガーを設計することは決してありません。挿入、削除、または更新された行を更新するように設計します。トリガーはバッチで動作するため、データベースにアクセスするコードで複数のレコードを変更することは決してないと想定することはできません。

これは、挿入または削除されたトリガーでのみ使用できる 2 つの疑似テーブルのいずれかに結合することによって行います。Inserted には新しいレコードまたは更新後の値が含まれ、delted には削除されたレコードの値または更新が発生する前の値が含まれます。

次のようなものを試すことができます:

ALTER TRIGGER [dbo].[geog_update] ON [dbo].[Site]
FOR UPDATE
AS
SET NOCOUNT ON


UPDATE S
    SET geog = geography::Point(i.[Latitude], i.[Longitude], 4326)
    FROM Site s 
    JOIN Inserted I on s.id = i.id
    WHERE Latitude is not null and Longitude is not null
于 2013-07-16T18:37:26.870 に答える