CREATE trigger [TRG_MRQC_BRZT_INSERT]  
on [MRQC_BRZT]  
for insert  
as  
begin  
  declare @ztid numeric(12,0), @czlx numeric(18,0),@czsj datetime ,@czgh varchar(10),@glid varchar(10)   
  declare @kssj datetime ,@jssj datetime   
  declare @ErrorMessage VARCHAR(400),@ErrorSeverity INT,@ErrorState INT  
  declare @bzxx varchar(20)  
  select @kssj=kssj,@jssj=jssj from inserted  
--1,一条记录新发生,开始时间不为空,结束时间为空  
  if @kssj is not null and @jssj is null   
  begin  
     if update(kssj)   
        set @bzxx = '新状态发生' --备注信息:状态发生  
        set @czlx=1            --操作类型  
        select @ztid=ztid,@czsj=kssj,@czgh =ksgh,@glid=glid from inserted  
        insert into mrqc_ztrz(ztid,czlx,czsj,czgh,glid,bzxx) values(@ztid,@czlx,@czsj,@czgh,@glid,@bzxx)  
  end   
--2,一条记录新结束,结束时间不为空,开始时间为空  
  if @kssj is null and @jssj is not null   
  begin   
     if update(jssj)    
        set @bzxx='新状态结束'  --备注信息:以前未发生的状态结束  
        set @czlx=2             --操作类型  
        select @ztid=ztid,@czsj=jssj,@czgh =jsgh,@glid=glid from inserted  
        insert into mrqc_ztrz(ztid,czlx,czsj,czgh,glid,bzxx) values(@ztid,@czlx,@czsj,@czgh,@glid,@bzxx)   
  end   
end  

解决方案 »

  1.   


    /*
    凭感觉改了下,未经测试
    */
    create or replace trigger trg_mrqc_brzt_insert
    before insert on mrqc_brzt
    for each row
    declare 
    kssj date;
    jssj date;
    begin
    kssj:=:new.kssj;
    jssj:=:new.jssj;
    if kssj is not null and jssj is null then
    insert into mrqc_ztrz(ztid,czlx,czsj,czgh,glid,bzxx) values(:new.ztid,1,:new,kssj,:new.ksgh,:new.glid,'新状态发生');
    end if;
    if kssj is null and jssj is not null then
    insert into mrqc_ztrz(ztid,czlx,czsj,czgh,glid,bzxx) values(:new.ztid,2,:new,kssj,:new.ksgh,:new.glid,'新状态结束');
    end if;
    end;
      

  2.   

    lz 的 sql server 触发器有些问题吧。
    既然是 for insert 触发器,还需要检查 update(kssj) ?
    inserted 表返回的是行集。这样只能处理一次插入一行的操作,如果一次插入多行,使用这个触发器就有问题。
    create or replace trigger trg_mrqc_brzt_insert
    after insert on mrqc_brzt
    for each row
    begin
     if :new.kssj is not null and :new.jssj is null then
      insert into mrqc_ztrz(ztid,czlx,czsj,czgh,glib,bzxx) 
       values(:new.ztid,1,:new.kssj,:new.ksgh,:new.glib,'新状态发生');
     end if;
     if :new.kssj is null and :new.jssj is not null then
      insert into mrqc_ztrz(ztid,czlx,czsj,czgh,glib,bzxx) 
       values(:new.ztid,2,:new.ksgh,:new.glib,'新状态结束');
     end if;
    end;

      

  3.   


    CREATE or replace trigger TRG_MRQC_BRZT_INSERT
      instead of insert or update on MRQC_BRZT
      for each row as
    declare
      ztid          number(12, 0);
      czlx          number(18, 0);
      czsj          date;
      czgh          varchar2(10);
      glid          varchar2(10);
      kssj          date;
      jssj          date;
      ErrorMessage  VARCHAR2(400);
      ErrorSeverity number;
      ErrorState    number;
      bzxx          varchar2(20);
    begin
      --1,一条记录新发生,开始时间不为空,结束时间为空   
      if :new.kssj is not null and :new.jssj is null then
        if inserting then
          :new.bzxx := '新状态发生'; --备注信息:状态发生   
          :new.czlx := 1; --操作类型    
          insert into mrqc_ztrz
            (ztid, czlx, czsj, czgh, glid, bzxx)
          values
            (:new.ztid, :new.czlx, :new.czsj, :new.czgh, :new.glid, :new.bzxx);
        end if;
      end if;
      --2,一条记录新结束,结束时间不为空,开始时间为空   
      if :new.kssj is null and :new.jssj is not null then
        if inserting then
          :new.bzxx = '新状态结束' --备注信息:以前未发生的状态结束   
          :new.czlx = 2 --操作类型    
          insert
            into mrqc_ztrz(ztid, czlx, czsj, czgh, glid, bzxx) values(:new.ztid,
                                                                      :new.czlx,
                                                                      :new.czsj,
                                                                      :new.czgh,
                                                                      :new.glid,
                                                                      :new.bzxx);
        end if;
      end if;
    end;
      

  4.   

    create or replace trigger tri_MRQC_BRZT_INSERT
    after insert 
    on MRQC_BRZT
    referencing new as new old as old 
    for each row
    begin if :new.kssj is not null and :new.jssj is null then
    insert into mrqc_ztrz(ztid,czlx,czsj,czgh,glid,bzxx) values(
    :new.ztid,1,:new.kssj,:new.ksgh,:new.glid,'新状态发生');
    end if;
    if :new.kssj is null and :new.jssj is not null then
    insert into mrqc_ztrz(ztid,czlx,czsj,czgh,glid,bzxx) values(
    :new.ztid,2,:new.kssj,:new.ksgh,:new.glid,'新状态结束');
    end if;
    end;