1

これが私のテーブルです:

dbo.Posts

  • PostId(IDENTITY、PK)
  • 主題
  • UniqueUri(NVARCHAR(350)、NOT NULL)

「投稿」を作成するときは、(組み込み関数を使用して)空白のUniqueUriNEWID()を挿入します。

次に、「投稿」テーブルにトリガーがあります。

CREATE TRIGGER [dbo].[OnAfterInsertUpdatePostTrigger]
   ON  [dbo].[Posts]
   AFTER INSERT, UPDATE
AS 
BEGIN
    SET NOCOUNT ON

    DECLARE @PostIds IdentityType

    INSERT INTO @PostIds
    SELECT PostId
    FROM INSERTED

    -- Create the UniqueUri's.
    EXECUTE [dbo].[UpdatePostsCleanedUriUniqueUri] @PostIds

END

これは、SPROCを呼び出してUniqueUriを作成します。

SPROCには次のようなコードがあります。

UPDATE a
    SET a.CleanedUri = NEWID(),
        a.UniqueUri = NEWID()
    FROM [dbo].[Posts] a
        INNER JOIN @PostIds b ON a.PostId = b.Id

投稿を1つだけ挿入しようとすると、1分以上かかることに気づきました。

これは再帰的なトリガー呼び出しであると推測できますか?

基本的に、投稿が作成/更新されるとき、私はユニークなURIを作成する必要があります(質問のために、スタックのように)。

私が考えることができる唯一の解決策は、UniqueUriと呼ばれる別のテーブルを作成することです。このテーブルには、PostId FKとUri、たとえば1-1しかなく、常に避けようとします。

次に、SPROCはそのテーブルを更新します。

他の提案/アイデアはありますか?

4

1 に答える 1

0

トリガーが再帰的に発生するのを防ぐ1つの解決策は、トリガーから列への変更を削除することです。

IF ( NOT UPDATE (CleanedUri) AND NOT UPDATE (UniqueUri ) )
BEGIN
    DECLARE @PostIds IdentityType      
    INSERT INTO @PostIds     
    SELECT PostId     
    FROM INSERTED      

    -- Create the UniqueUri's.     
    EXECUTE [dbo].[UpdatePostsCleanedUriUniqueUri] @PostIds 
END;
于 2011-01-13T23:59:47.427 に答える