表如下 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.   

    你真表结构太乱了,没看懂上级id和id的关系
      

  2.   

    /*以下供你参考,当嵌套层数之内修改的数据达不到你实际修改量时(也就是一次修改可能导致连动修改的数据量太多时),可能有就修改不彻底*/
    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 行)
    */