我前年做的一个项目,修改别人的程序,有个地方没有注意到,项目完了才发现,最重要的一个表中,有许多记录被误删了。
我希望能用触发器实现:
有个很重要的表a,另外一个表b的结构与a基本一样,只比a多一个时间字段,
我希望表a中的任何一行,在被update或del之前,能把此行原来的内容复制插入到b中去,再加上个操作时间。
大家能帮我写这个触发器吗?     因为我对触发器不怎么懂(虽然也看了一些资料)
最好是帮我写oracle与sql server两个版本的。(要不我还得去sql 那里再发一回)
先谢谢大家。

解决方案 »

  1.   

    create table t(
    id number(18,0),
    name varchar2(20),
    sex varchar2(4)
    );create table t_log(
    id number(18,0),           -- 保留更新前的ID
    name varchar2(20),         -- 保留更新前的name
    sex varchar2(4),           -- 保留更新前的sex
    newid number(18,0),        -- 保留更新后的ID    (如果是删除操作,此字段为值为空)
    newname varchar2(20),      -- 保留更新后的name  (如果是删除操作,此字段为值为空)
    newsex varchar2(4),        -- 保留更新后的sex   (如果是删除操作,此字段为值为空)
    uptype varchar2(10),       -- 操作类型('UP': 代表更新操作;'DE': 代表删除操作 )
    udate date DEFAULT SYSDATE -- 操作日期(默认值为当前日期)
    );CREATE OR REPLACE TRIGGER inst_up_t
    AFTER UPDATE OR DELETE ON t
    FOR EACH ROW
    BEGIN
      IF UPDATING THEN
        INSERT INTO t_log(id,name,sex,newid,newname,newsex,uptype) VALUES(:old.id, :old.name, :old.sex, :new.id, :new.name, :new.sex, 'UP');
      ELSIF DELETING THEN
        INSERT INTO t_log(id,name,sex,uptype) VALUES(:old.id, :old.name, :old.sex, 'DE');
      END IF;
    END;
    /
      

  2.   

    恩,oracle用触发器,sql server就不了解了
      

  3.   

    create or replace trigger a_trigger
      before delete or update on  a
      for each row
    declare
    begin
      if updating then
         insert into b values(:old.id,sysdate);
      elsif deleting then
          insert into b values(:old.id,sysdate);       
      end if;
    end a_trigger;
      

  4.   

    luoyoumou写得真好,哪位大哥再帮我改成个sql server版的啊。
      

  5.   

    我来一个sqlserver的:
    create trigger trgInsert
    on table_name
    for insert,update,deltete
    as
    DECLARE @id tinyint,
       @name varchar(20),
       @count int,--记录table的记录数
       @i int--循环变量
    set @i=0
    select @count=count(*) 
    from table_name
    while @i<@count
    begin
    SELECT @id= id, 
          @name= name
    from table_name
    insert into new_teble_name values(@id,@name,getdate())
    set @i=@i+1
    end
      

  6.   

    3楼的有问题,
    9楼的OK  用  before 好些,after也行,
      

  7.   

    SQLSERVER中的inserted和deleted同ORACLE的:NEW和:OLD不同,可以作为表来用的
    也就是可以
    INSERT INTO TB_B SELECT A.*,GETDATE FROM deleted A;
      

  8.   

    Oracle中可以使用returing 字段 into 变量   的方式来完成记录的拷贝!