有一个表:
create table dept(
id int not null primary key,
name varchar(50),
tel varchar(50),
flag char(1),
utime datetime
)
怎么写一个触发器,当做 insert 一条记录时,utime 字段赋值 当前时间;
修改记录时,utime 字段赋值 当前时间 和 flag 赋值 'U' ;
删除记录时,utime 字段赋值 当前时间 和 flag 赋值 'D' 呢?
希望能给出源码,谢谢各位了!
21 个解决方案
当做 insert 一条记录时,utime 字段赋值 当前时间
----------------------------------------------------
这个要求你可以在utime数据列上创建默认值default为getdate()
----创建测试数据
if object_id('tbdept') is not null
drop table tbdept
GO
create table dept(
id int not null primary key,
name varchar(50),
tel varchar(50),
flag char(1),
utime datetime
)
GO
----创建INSERT触发器
create trigger trg_insert_dept on tbdept
for insert
as
update a set utime = getdate() from tbdept as a inner join inserted as i
on a.id = i.id
GO
----创建UPDATE触发器
create trigger trg_update_dept on tbdept
for update
as
update a set utime = getdate(),flag = 'U' from tbdept as a inner join inserted as i
on a.id = i.id
GO
修改记录时,utime 字段赋值 当前时间 和 flag 赋值 'U' ;
删除记录时,utime 字段赋值 当前时间 和 flag 赋值 'D'
-----------------------------------------------------------
这个不太明白!
请LZ说清楚点!是把这个表中所有的utime和flag都作一个更改吗?还是...
抱歉,更正一下,上面回复中的create table dept应为create table tbdept:
----创建测试数据
if object_id('tbdept') is not null
drop table tbdept
GO
create table tbdept(
id int not null primary key,
name varchar(50),
tel varchar(50),
flag char(1),
utime datetime
)
GO
----创建INSERT触发器
create trigger trg_insert_dept on tbdept
for insert
as
update a set utime = getdate() from tbdept as a inner join inserted as i
on a.id = i.id
GO
----创建UPDATE触发器
create trigger trg_update_dept on tbdept
for update
as
update a set utime = getdate(),flag = 'U' from tbdept as a inner join inserted as i
on a.id = i.id
GO
修改记录时,utime 字段赋值 当前时间 和 flag 赋值 'U' ;
删除记录时,utime 字段赋值 当前时间 和 flag 赋值 'D'
-----------------------------------------------------------
这个不太明白!
请LZ说清楚点!是把这个表中所有的utime和flag都作一个更改吗?还是...
是被修改的记录
create trigger tri_A on dept instead of update as
update dept set name=b.name,tel=b.tel,flag='U',utime=getdate() from inserted b
where id=b.id
当修改记录时,utime 字段赋值 当前时间 和 flag 赋值 'U',使用下面的触发器:
create trigger t_Update on dept
for update
as
update dept set utime=getdate(),flag='U' where id = (select id from deleted)
go
删除记录时,utime 字段赋值 当前时间 和 flag 赋值 'D'
这种情况,LZ你刚才说了“是被修改的记录”的utime 字段赋值 当前时间 和 flag 赋值 'D',这不是矛盾了吗?因为此时该记录已经被删除了。
执行删除操作记录的才 flag 赋值 'D' ,然后取销删除
当删除记录时,utime 字段赋值 当前时间 和 flag 赋值 'U',使用下面的触发器:
create trigger t_Update on dept
instead of delete
as
update dept set utime=getdate(),flag='D' where id = (select id from deleted)
go
更正:
当删除记录时,utime 字段赋值 当前时间 和 flag 赋值 'D',使用下面的触发器:
create trigger t_Update on dept
instead of delete
as
update dept set utime=getdate(),flag='D' where id = (select id from deleted)
go
如果表没有主键,那怎么办?
----------------------------------------------
楼主在创建表的时候,不是create table dept(
id int not null primary key....
指出id为主键了吗?
何况,在关系数据库中,每个表最好都需要有一个主键的。
create trigger iuddept on dept
for insert,update ,delete
as
begin
if not exists(select 1 from deleted)
begin
update dept set utime=getdate() from dept a,inserted b
where a.id=b.id
end
if not exists(select 1 from inserted)
begin
insert into dept select id,name,tel,'D',getdate() from deleted
end
if exists(select 1 from inserted) and exists(select 1 from deleted)
begin
update a set utime=getdate(),flag='U' from dept a,deleted b,inserted i
where a.id=b.id and i.id=a.id
end
end