MSSQL 触发器 怎么修改记录的值?


有一个表:
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 个解决方案

#1


当做 insert 一条记录时,utime 字段赋值 当前时间
----------------------------------------------------
这个要求你可以在utime数据列上创建默认值default为getdate()

#2


----创建测试数据
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

#3


修改记录时,utime 字段赋值 当前时间 和 flag 赋值 'U' ;
删除记录时,utime 字段赋值 当前时间 和 flag 赋值 'D'
-----------------------------------------------------------
这个不太明白!
请LZ说清楚点!是把这个表中所有的utime和flag都作一个更改吗?还是...

#4


抱歉,更正一下,上面回复中的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

#5


create trigger tri_A on dept instead of insert as
insert dept(name,tel,flag,utime) select name,tel,flag,getdate() from inserted
create trigger tri_A on dept instead of update as
update dept set name=b.name,tel=b.tel,flag='D',utime=getdate() from inserted 
--删除了还怎么赋值

#6


改U

#7


修改记录时,utime 字段赋值 当前时间 和 flag 赋值 'U' ;
删除记录时,utime 字段赋值 当前时间 和 flag 赋值 'D'
-----------------------------------------------------------
这个不太明白!
请LZ说清楚点!是把这个表中所有的utime和flag都作一个更改吗?还是...

是被修改的记录

#8


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

#9


当修改记录时,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

#10


删除记录时,utime 字段赋值 当前时间 和 flag 赋值 'D'
这种情况,LZ你刚才说了“是被修改的记录”的utime 字段赋值 当前时间 和 flag 赋值 'D',这不是矛盾了吗?因为此时该记录已经被删除了。

#11


执行删除操作记录的才 flag 赋值 'D' ,然后取销删除

#12


当删除记录时,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

#13


更正:
当删除记录时,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

#14


如果表没有主键,那怎么办?

#15


那么怎么定位记录

#16


怎么定位记录,真是个问题。

#17


如果表没有主键,那怎么办?
----------------------------------------------
楼主在创建表的时候,不是create table dept(
id int not null primary key....
指出id为主键了吗?
何况,在关系数据库中,每个表最好都需要有一个主键的。

#18


有些表是客户定的,没有主键

#19


真没办法吗?

#20


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

#21


测试已经通过!!!
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告