Hi yaip,
I discovered a minor flaw in the previous code when new records contain sequence numbers that are greater than the existsing numbers (if a gap in the DisplaySeq values is considered a gap).
The following code fixes this:
create table test_tab
(RoleID int
,MenuID int
,DisplaySeq int
,primary key (RoleID, MenuID)
)
go
create trigger test_trg
on test_tab
after insert
as
begin
-- first we need to update all new DisplaySeq values to 0
-- this prevents gaps in the column value when a record with
-- a higher sequence number is added
update test_tab
set DisplaySeq = 0
from inserted i
where test_tab.RoleID = i.RoleID
and test_tab.MenuId = i.MenuID
declare c_new cursor local fast_forward
for
select RoleID, MenuID
from inserted
declare @newRoleID int, @newMenuID int
open c_new
fetch next from c_new
into @newRoleID, @newMenuID
while @@fetch_status = 0
begin
update test_tab
set DisplaySeq = isnull(t.new_val, 0) + 1
from (select max(DisplaySeq) new_val
from test_tab tt
where RoleID = @newRoleID
) t
where RoleID = @newRoleID
and MenuID = @newMenuID
fetch next from c_new
into @newRoleID, @newMenuID
end
close c_new
deallocate c_new
end
go
-- let's do some inserts
insert
into test_tab (RoleID, MenuID, DisplaySeq)
values (1, 1, 1)
insert
into test_tab (RoleID, MenuID, DisplaySeq)
values (1, 2, 1)
-- insert multiple records with higher sequence numbers
insert
into test_tab (RoleID, MenuID, DisplaySeq)
select 1, MenuID + 2, 10
from test_tab
go
select *
from test_tab
drop table test_tab
go
Cheers,
Henk