| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 759 人关注过本帖
标题:触发器的问题
只看楼主 加入收藏
chenxiang
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2007-3-14
收藏
 问题点数:0 回复次数:7 
触发器的问题
两个表anclass和nclass,
anclass中的字段 picname,picurl
nclass中的字段, picname,title


要求1:删除anclass的记录时,触发删除nclass表中picname相同的记录
2:更新anclass的picname,触发更新nclass表中picname相同的记录
3.更新anclass的picurl时,nclass的记录不变




偶想了N久都没有搞定,偶想把他们写为一个触发器,即create trigger on anclass for update,delete .....


谢谢各位大虾


搜索更多相关主题的帖子: 触发器 anclass picname 字段 
2007-10-06 15:57
purana
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:广东-广州
等 级:版主
威 望:66
帖 子:6039
专家分:0
注 册:2005-6-17
收藏
得分:0 

我的msn: myfend@
2007-10-06 17:13
chenxiang
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2007-3-14
收藏
得分:0 
版主首先感谢你的回答,由您的这个链接,还是为我使我这个新人学到很多东西,不过,我的需求是在sql server上写

,并且我希望是写为一个trigger而不是两个trigger

版主,烦劳您的再次指导,谢谢
2007-10-06 20:47
purana
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:广东-广州
等 级:版主
威 望:66
帖 子:6039
专家分:0
注 册:2005-6-17
收藏
得分:0 
[CODE]create trigger tri_test on anclass
for update,delete
as
begin
if update(picname)
begin
update nclass set nclass.picname=i.picname
from deleted d,inserted i
where nclass.picname=d.picname
return
end
if update(picurl)
return
delete from nclass where picname=(select top 1 picname from deleted d)
end
go[/CODE]

我的msn: myfend@
2007-10-06 21:31
chenxiang
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2007-3-14
收藏
得分:0 
恩,版主谢谢您,我回去试下,
2007-10-07 12:56
thllilac
Rank: 1
等 级:新手上路
帖 子:51
专家分:0
注 册:2007-9-7
收藏
得分:0 

create table anclass
(
picname nvarchar(20),
picurl nvarchar(20)
)
create table nclass
(
picname nvarchar(20),
title nvarchar(20)
)

insert into anclass values('部门1','100人')
insert into anclass values('部门2','200人')
insert into anclass values('部门3','300人')

insert into nclass values('部门1','logo1')
insert into nclass values('部门1','logo11')
insert into nclass values('部门1','logo111')
insert into nclass values('部门2','logo2')
insert into nclass values('部门3','logo3')

select * from anclass
select * from nclass


create trigger upda
on anclass
for update
as
begin
if(update(picname))
begin
declare @picnameold nvarchar(20)
declare @picnamenew nvarchar(20)
select @picnameold=picname from deleted
select @picnamenew=picname from inserted
update nclass set picname=@picnamenew where picname=@picnameold
commit tran
end
end
go

create trigger dele
on anclass
for delete
as
begin
declare @picnameold nvarchar(20)
select @picnameold=picname from deleted
delete from nclass where picname=@picnameold
commit tran
end
go


update anclass set picname='doudou' where picname='部门1'
update anclass set picurl='101人' where picurl='100人'
delete from anclass where picname='部门3'
试试?
反正我试是可以的呵


曾经有一个女孩问我:“你长的帅不帅?”我说:“不帅。”她打了我一巴掌,生气的说:“你骗人!”
2007-10-08 11:40
thllilac
Rank: 1
等 级:新手上路
帖 子:51
专家分:0
注 册:2007-9-7
收藏
得分:0 

当然写在一起省点事了

create trigger updaDELE on anclass
for update,delete
as
begin
declare @picnameold nvarchar(20)
declare @picnamenew nvarchar(20)

select @picnameold=picname from deleted
select @picnamenew=picname from inserted


if(update(picname))
begin
update nclass set picname=@picnamenew where picname=@picnameold
return
end

if(isnull(@picnamenew,'aa')='aa')
begin
delete from nclass where picname=@picnameold
return
end
end
go


曾经有一个女孩问我:“你长的帅不帅?”我说:“不帅。”她打了我一巴掌,生气的说:“你骗人!”
2007-10-08 11:59
胡桂生
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-9-14
收藏
得分:0 

create trigger tri_anclass
on anclass
for insert,update,delete
as
declare @count1 int --声明两个整型变量作统计
declare @count2 int
declare @update_later nvarchar(10) --保存update之后的数据
declare @update_before nvarchar(10) --保存update之前的数据
begin
set @count1 = 0 --为变量赋初值
set @count2 = 0
select @count1 = count(*) from inserted --统计inserted表中的记录数
select @count2 = count(*) from deleted --统计deleted表中的记录数
/*因为我写的是after触发器,它是在记录变更后才被激活的,我根据insert,delete和update
操作后两张表(inserted,deleted)中记录数的变化来判断对表进行了哪种操作,从而匹配不同的
处理函数*/
if(@count1 > 0 and @count2 = 0) --insert操作
begin
print 'One line was inserted.'
end
if(@count1 = 0 and @count2 > 0) --delete操作
begin
delete from nclass where picname in (select picname from deleted)
end
if(@count1 = 1 and @count2 = 1) --update操作
select @update_later = picname from inserted
select @update_before = picname from deleted
begin
update nclass set picname = @update_later where picname = @update_before
end
end
我看到了7楼的帖子很正确的,但是我还是发了我的,原因有:
如果分开了写3个或2个触发器很简单,这个题的难点不是对两个表的操作上(例如:删除anclass的记录时,触发删除nclass表中picname相同的记录),而是难在 insert,delete,update在同一个触发器中,怎样判断对表进行了insert,update还是delete的操作,分清了这一点,就是换了其他的操作,只需要修改其中部分语句就可以。
这是我的浅陋的见解,不足之处请不吝指正,我也刚学了数据库 多多交流 共同进步。
另外请查看DML触发器(after触发器和instead of触发器)的工作原理,和各种触发器被激发时,deleted 表和inserted表中存放数据的变化。

2007-10-09 23:15
快速回复:触发器的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.076289 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved