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