表                   字段(编号)      字段       字段
restorebase                 prodnr         desript1      descmemo
bomchangeproduct            masternr        descript1     sizememo
bomproduct                  masternr        descript1     sizememo
stdprocesschangespbase      prodnum         description   descmemo
stdprocesschangespmaterial  prodnr          descript1     sizememo
stdprocessspbase            prodnum         description   descmemo
stdprocessspmaterial        prodnr          descript1     sizememo
stdprocessspprod            prodnr          descript1     sizememo
当表restorebase 字段desript1、descmemo里内容更改时触发器更新其它表的相应字段内容  我的是ERP系统 字段(编号)是产品编号 字段是品名规格备注之类的 
大家帮忙看一下这样怎么写一个触发器!

解决方案 »

  1.   

    那就在restorebase表上建个update触发器不就好了
    要更新其他表的相应字段就根据这个配置表关联起,更新就是了啊
      

  2.   

    Create trigger tr_restorebase_update on restorebase
    for update 
    as
    if NOT update(desript1) or  NOT update(descmemo)
    RETURN
    update s
    set description=desript1,descmemo=i.descmemo
    from inserted i 
    inner join stdprocesschangespbase s  on i.prodnr =s.prodnum ........................一個個表的
     
      

  3.   

    嗯,首先我先给你举一个你需要的例子,我刚刚写的仅仅以两个表为例子 每个表三个字段 附加了测试数据create database xxx
    go
    use xxx
    go
    create table tb1(
    number_ varchar(50),
    one_ varchar(50),
    two_ varchar(50)
    )
    go
    create table tb2(
    number_ varchar(50),
    first_ varchar(50),
    second_ varchar(50)
    )
    go--建立触发器
    create trigger trgr_tb1_ on tb1 
    for update --当修改时候启动
    as
    --以下是语句(公共部分)
    declare --分别设置与tb1相同字段的变量
    @number_ varchar(50),
    @two_ varchar(50),
    @one_ varchar(50)
    select @number_= number_ from inserted --先获得要修改的编号
    if( (select count(*) from tb2 where number_ = @number_ )=0) --判断如果需要被自动修改的那张表中是否有这行数据
    insert into tb2 values (@number_,' ',' ')--如果没有自动添加一行
    --以上是共用部分
    --以下是分支
    if update(one_)--如果修改one_ 字段
    select @one_ = one_ from inserted --从"预修改表"中查出one_字段将要改变后的数据 inserted是数据库默认的直接用就行
    update tb2 set first_ = @one_ where tb2.number_ = @number_ --修改另一张表
    --以下是同理的第二个字段判断
    if update(two_)
    select @two_ = two_ from inserted
    update tb2 set second_ = @two_ where tb2.number_ = @number_--以下是测试数据go
    insert into tb1 values('123','qqq','www')
    go
    insert into tb2 values('123','aaa','www')
    go
    update tb1 set one_ = 'zzz' where number_ = '123'
    go
    select * from tb1
    go
    select * from tb2其次呢,我虽然终究结果都是可行的,但是从面相对象的角度来考虑,触发器的出现虽然代表这数据库功能的完善,但是并不是一个很好的机制,曾经我们在做电业局项目的时候后台的数据库就是因为过多的运用触发器,导致速度比正常的情况下慢了一倍左右,事实证明触发器并不适合数据库使用,因为数据库的职能就是记录,从解耦的角度来理解就很明白了,我们有现成的负责运算的系统,就想到你有计算器,跟一个账本,你见过谁那这计算机还在账本上列竖式加减乘除的??上边的例子足以说明问题,但是你的表是在太多了,如果都接进去也没意义,你如果看不明白就问我好了:)但是还是不希望你这么用,效率是很重要的.
      

  4.   

    我刚刚看了二楼的写法 不是完全正确
    if语句必须要分开写
    举例子
    if(真 或 真)
    执行这样只要有一个真也会执行
    而你的例子中 如果仅仅修改某一个字段 也是只有一个真 这样也会执行
    而在进行修改另一个字段的时候就会获得不到数据,这样你每次都要吧所以的字段都写上才OK
    不支持仅仅修改某一个字段,而是把你不打算修改的字段也要原样写上去才可以
    另外,这样的运行效率由于没有处于判断中,所以每次运行就等于全部运行,
    我推测2楼的用意是在于如果你打算就改编号 就意味着 两个真都是假
    这样的思路是可行的 但是想想看 编号作为标识列 并没有修改的必要
    如果就算有的话,也应该用判断的方式 实现对每个字段是否修改的判断
    所以我说触发器并不适合在数据库中使用,程序才是计算器,数据库就是个账本
      

  5.   

    create trigger trgr_restorebase on restorebase
    for update
    as
    declare
    @prodnr varchar(30)
    @descript1 varchar(30)
    @descmemo varchar(30)
    select @prodnr=prodnr from inserted
    if update(descript1)
    select @descript1=descript1 from inserted
    update bomchangeproduct set descript1=@descript1 where bomchangeproduct.mastrnr=@prodnr
    if update(descmemo)
    select @descmemo=descmemo from inserted
    update bomchangeproduct set sizememo=@descmemo where bomchangeproduct.mastrnr=@prodnr
    if update(descript1)
    select @descript1=descript1 from inserted
    update bomproduct set descript1=@descript1 where bomproduct.mastrnr=@prodnr
    if update(descmemo)
    select @descmemo=descmemo from inserted
    update bomproduct set sizememo=@descmemo where bomproduct.mastrnr=@prodnr大家帮忙看一下这样写可以吗?