表如下 a:ID 名称 编码 上级ID
1 第一级1 01
2 第一级2 02
3 第二级1 01001 1
4 第二级2 01002 1
5 第二级3 02001 2
6 第三级1 0100100001 3
7 第三级2 0100200001 4
8 第三级3 0100200002 4比如“第二级1”的“上级ID”为1,则其编码的前2位就是“ID”为1的“编码”01;“第三级2”的“上级ID”为3,则其编码的前5位就是“ID”为4的“编码”01002,我现在想实现的是,比如如果修改了ID=3的记录,将其“上级ID”修改为2,则从ID=4的记录以及其以下的记录的编码均会对应修改,修改后的表会如下:
ID 名称 编码 上级ID
1 第一级1 01
2 第一级2 02
3 第二级1 02002 2
4 第二级2 01002 1
5 第二级3 02001 2
6 第三级1 0200200001 3
7 第三级2 0100200001 4
8 第三级3 0100200002 4其对应的编码会自动修改,并避免产生相同的编码,请问如何通过触发器实现?
谢谢了!!
1 第一级1 01
2 第一级2 02
3 第二级1 01001 1
4 第二级2 01002 1
5 第二级3 02001 2
6 第三级1 0100100001 3
7 第三级2 0100200001 4
8 第三级3 0100200002 4比如“第二级1”的“上级ID”为1,则其编码的前2位就是“ID”为1的“编码”01;“第三级2”的“上级ID”为3,则其编码的前5位就是“ID”为4的“编码”01002,我现在想实现的是,比如如果修改了ID=3的记录,将其“上级ID”修改为2,则从ID=4的记录以及其以下的记录的编码均会对应修改,修改后的表会如下:
ID 名称 编码 上级ID
1 第一级1 01
2 第一级2 02
3 第二级1 02002 2
4 第二级2 01002 1
5 第二级3 02001 2
6 第三级1 0200200001 3
7 第三级2 0100200001 4
8 第三级3 0100200002 4其对应的编码会自动修改,并避免产生相同的编码,请问如何通过触发器实现?
谢谢了!!
exec sp_configure 'nested triggers',1 --开启触发器嵌套
exec sp_dboption 'test', 'recursive triggers',TRUE --开启库的触发器递归
go
CREATE TABLE b_(a INT,b VARCHAR(20),c VARCHAR(100),d INT)
insert b_ select 1,'第一级1','01',null
union all select 2,'第一级2','02',null
union all select 3,'第二级1','01001',1
union all select 4,'第二级2','01002',1
union all select 5,'第二级3','02001',2
union all select 6,'第三级1','0100100001',3
union all select 7,'第三级2','0100200001',4
union all select 8,'第三级3','0100200002',4GO
--附助表,防止嵌套超限
CREATE TABLE cc_(a INT)
INSERT cc_ SELECT 0
GO
CREATE TRIGGER tr_b_
ON b_
FOR UPDATE
AS
BEGIN
IF UPDATE(d)
BEGIN
UPDATE cc_ SET a=a+1
IF EXISTS(SELECT 1 FROM cc_ WHERE a<32)
UPDATE c SET c.c=(
SELECT RIGHT('00000000000000000000'+LTRIM(MAX(c)+1),LEN(a.c)) FROM b_ WHERE LEN(c)=LEN(a.c) AND LEFT(c,LEN(b.c))=b.c
)
FROM INSERTED a INNER JOIN b_ b ON a.d=b.a
INNER JOIN b_ c ON a.a=c.a
END
IF UPDATE(c)
BEGIN
UPDATE cc_ set a=a+1
IF EXISTS(SELECT 1 FROM cc_ WHERE a<32)
UPDATE b SET b.c= STUFF(b.c,1,LEN(a.c),a.c)
FROM INSERTED a INNER JOIN b_ b ON a.a=b.d
END
END
GO
UPDATE b_ set d=2 WHERE a=4SELECT *FROM b_--RESULT
/*a b c d
----------- -------------------- ------------------------------ -----------
1 第一级1 01 NULL
2 第一级2 02 NULL
3 第二级1 01001 1
4 第二级2 02002 2
5 第二级3 02001 2
6 第三级1 0100100001 3
7 第三级2 0200200001 4
8 第三级3 0200200002 4(所影响的行数为 8 行)
*/