-1

わかりましたので、かなり基本的なトリガーがあります:

つまり、挿入後、IP 情報を取得し、挿入された行を新しいデータで更新します。

CREATE TRIGGER [BasicData.IPInfo.Gather]
ON [BasicData]
AFTER INSERT
AS
BEGIN
    DECLARE @City VARCHAR(1000),
        @Country VARCHAR(1000),
        @IP VARCHAR(1000),
        @ROWID UNIQUEIDENTIFIER

    SELECT @IP=[IP],@ROWID=[ID] FROM [inserted]

    SELECT @Country = [Country], @City= [City]
    FROM [IPInfo] WHERE [IP] = @IP

    IF (@City IS NOT NULL) AND (@Country IS NOT NULL)
        BEGIN -- Never seems to fire
            UPDATE [BasicData]
            SET [IPCountry]=@Country,[IPCity]=@City
            WHERE [ID] = @ROWID
        END
    ELSE
        BEGIN -- Fired correctly
            INSERT INTO [IPInfo.Missing] VALUES (@IP)
        END
END

問題は、欠落している IP 情報を正しく追加することです (欠落している場合のみ)。

私は考えられるあらゆる方法でそれを微調整しました...(私のトリガーの知識はかなり悪いです)

4

1 に答える 1

0

いくつかの問題があります:

  1. INSERTED には多くの行を含めることができます。トリガーで許可されるのは 1 つだけです。
  2. トリガーはAFTER INSERTであり、これによりUPDATEが除外される可能性があると思います。試すAFTER INSERT, UPDATE
  3. IF ステートメントが UPDATE をチェックしていません。列が NULL に UPDATED されている場合はどうなりますか? それがアップデートだったとしても、それをキャッチしません。何かが NON NULL データを挿入した場合はどうなりますか? それはUPDATEだったと思うでしょう。

私の知る限り、UPDATE を識別する唯一の方法は INSERTED、PK に参加して「DELETED」することです。一致する場合は、更新されています。

おそらく、次のように書き直すことができます。

CREATE TRIGGER [BasicData.IPInfo.Gather]
ON [BasicData]
AFTER INSERT, UPDATE
AS
BEGIN

-- Save UPDATES to BasicData
UPDATE [BasicData]
SET [IPCountry]=I.Country,[IPCity]=I.City
FROM [BasicData] UT
INNER JOIN
[inserted] I
ON I.ID = UT.ID
INNER JOIN
Deleted D
ON D.ID = I.ID
INNER JOIN
[IPInfo] IP
ON I.ID = IP.ID

-- Save inserts to Missing
INSERT INTO [IPInfo.Missing] (IP)
SELECT IP FROM
INSERTED I
WHERE NOT EXISTS (SELECT 1 FROM DELETED D WHERE D.ID = I.ID)

END
于 2013-04-07T08:21:55.197 に答える