Tsql 创建唯一的URI段塞-这是递归触发器吗?(SQL Server)

Tsql 创建唯一的URI段塞-这是递归触发器吗?(SQL Server),tsql,sql-server-2008,triggers,slug,recursive-query,Tsql,Sql Server 2008,Triggers,Slug,Recursive Query,这是我的桌子: dbo.Posts PostId(身份、主键) 主题 UniqueUri(NVARCHAR(350),非空) 创建“Post”时,插入一个空白的UniqueUri(使用NEWID()内置函数) 然后,我在“Post”表上有一个触发器: 它调用存储过程来创建唯一的Uri 存储过程有如下代码: UPDATE a SET a.CleanedUri = NEWID(), a.UniqueUri = NEWID() FROM [dbo].[Posts]

这是我的桌子:

dbo.Posts

  • PostId(身份、主键)
  • 主题
  • UniqueUri(NVARCHAR(350),非空)
创建“Post”时,插入一个空白的UniqueUri(使用
NEWID()
内置函数)

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

它调用存储过程来创建唯一的Uri

存储过程有如下代码:

UPDATE a
    SET a.CleanedUri = NEWID(),
        a.UniqueUri = NEWID()
    FROM [dbo].[Posts] a
        INNER JOIN @PostIds b ON a.PostId = b.Id
我注意到,当我试图只插入一篇帖子时,它占用了我一分钟的时间

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

基本上,当一篇文章被创建/更新时,我需要创建唯一的uri(很像堆栈,用于提问)

我能想到的唯一解决方案是创建另一个名为UniqueUri的表,它除了PostId FK和Uri之外什么都没有,例如1-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;

这确实有效——但最终的问题是地理表上缺少索引(这里缺少索引可能会导致死亡),所以这是问题所在,而不是递归触发器。但是,我会接受这个答案,因为如果它是递归调用,这将解决问题。谢谢
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;