我一直在寻找stackoverflow,但我没有找到我要找的东西。我有一个 Sql Server 数据库。我想在每次插入或更新时更新一个带有“优先级”字段的表。
问题是我想使用以下规则执行优先级堆:1.-如果我尝试插入的值具有已经存在的优先级值,则表中的每个连续行都必须更改其优先级值加上 1. 2.-如果我尝试插入的值具有不存在的优先级,则触发器不执行任何操作。
这是我建立的触发器:
ALTER trigger [Priority]
on [dbo].[TBL_PILA]
after insert, update
AS
declare @priority int;
declare @reg_id int;
SELECT @reg_id =i.id from inserted i;
SELECT @priority =PRIORITY from TBL_PILA where ID =@reg_id
-- perform update here in TBL_PILA table
UPDATE TBL_PILA SET PRIORITY=PRIORITY+1 WHERE ID <>@reg_id AND PRIORITY>=@priority
GO
编辑:作为建议,我像这样更改触发器主体:
ALTER trigger [Priority]
on [dbo].[TBL_PILA]
after insert, update
if exists (select *
from inserted i join TBL_PILA m
on i.ID = m.ID
)
update TBL_PILA set PRIORITY = PRIORITY + 1
where exists (select * from inserted i
join TBL_PILA m
on i.ID = m.ID
where m.PRIORITY>=i.PRIORITY)
现在我有一个新问题:插入的优先级值受触发器影响,它也被加1。
有人知道如何增加仅影响某些范围的优先级值,如下所述?
问题是只要存在几个连续值和一个不连续值,触发器就必须停止。示例 优先级 1 2 4 5 6 8
如果我尝试插入优先级 = 3 的行,结果应该是:1 2 3 4 5 6 8
然后,如果我尝试插入优先级 = 4 的行,则结果应为: 1 2 3 4(插入值) 5 (4+1) 6 (5+1) 7 (6+1) 8
但是使用我构建的触发器,我得到了:1 2 3 4 5 6 7 9 (8+1)