1

这是我的桌子:

dbo.帖子

  • PostId(身份,PK)
  • 主题
  • UniqueUri (NVARCHAR(350), NOT NULL)

当我创建“帖子”时,我插入了一个空白的UniqueUri(使用NEWID()内置函数)。

然后我在“发布”表上有一个触发器:

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 来创建唯一的 Uri。

SPROC 有一些这样的代码:

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

我注意到当我尝试只插入一个帖子时,它需要一分钟多的时间。

我只能推断这是一个递归触发调用?

基本上,当创建/更新帖子时,我需要创建唯一的 uri(很像堆栈,用于问题)。

我能想到的唯一解决方案是创建另一个名为 UniqueUri's 的表,它除了 PostId FK 和 Uri 之外什么都没有,例如 1-1,我总是尽量避免。

然后 SPROC 将更新该表。

还有其他建议/想法吗?

4

1 回答 1

0

防止触发器递归触发的一种解决方案是消除触发器中对列的更改:

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 回答