Tsql 创建唯一的URI段塞-这是递归触发器吗?(SQL Server)
这是我的桌子: dbo.PostsTsql 创建唯一的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]
- PostId(身份、主键)
- 主题
- UniqueUri(NVARCHAR(350),非空)
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;