触发器生成!
现有两张表:a(id,.....)
b(id,pk,flag)
对一张数据表:a进行触发
如果对表a进行添加,删除,修改记录,马上触发表b,在表b中只要把表a中的关键字放入pk中,相应的做出判断标志(例如是修改就把flag置成‘1’)
希望得到大家解决!!
问题点数:100、回复次数:22Top
1 楼zjcxc(邹建)回复于 2005-06-02 15:34:48 得分 100
create triger tr_process on a
for insert,update,delete
as
if exists(select * from inserted)
if exists(select * from deleted)
update b set flag=1 from b,inserted i where b.pk=i.id --更新
else
insert b(pk,flag) select id,0 from inserted --新增
else
delete b from b,inserted i where b.pk=i.id --删除
Top
2 楼yeshucheng(叶澍成★七哥)回复于 2005-06-02 16:15:04 得分 0
上面的语句好象有点问题Top
3 楼yeshucheng(叶澍成★七哥)回复于 2005-06-02 16:48:00 得分 0
可能我问题还没有说清楚:
a(x,y....)x是关键字段
b(pk,flag)
现在要把x的变动写到b中的pk里,然后相应的写入标志Top
4 楼zjcxc(邹建)回复于 2005-06-02 20:48:14 得分 0
x是关键字段,x都变了,怎么和b表的值对应?
举数据说明问题.Top
5 楼yeshucheng(叶澍成★七哥)回复于 2005-06-02 21:23:26 得分 0
举个例子:
a表: b表:
GBI_ID name stock pk flag
43245 dfsdf 甲级别
54454 asdfdf 乙级别------>
22334 ffffff 丙级别
其中:GBI_ID是关键字 b表中的pk是要把GBI_ID中的字段通过新增,修改,删除放到里面。
同时对表a操作的同时要置flag标志位:0新增,1修改,2删除
现在的问题是,你写的方法(特别是修改)会对b表生成产生多条记录!!!
不知道我描述的清楚!!
Top
6 楼zjcxc(邹建)回复于 2005-06-02 21:27:47 得分 0
还是不清楚,你给的数据中,b表是空表,看不出你要想怎么处理。
你可以这样举例子
1、假设两个表都是空表,现在在a表插入三条记录,那么b表做何处理?
2、对a表的数据随便修改两条(注意是一次性修改),那么b表做何处理?
3、再举删除的要求。
Top
7 楼yeshucheng(叶澍成★七哥)回复于 2005-06-02 21:36:34 得分 0
呵呵,可能我说的不好:)B表前面还有个id是流水号,我这里没有写出来
1。假设两个表都是空表,现在在a表插入三条记录,那么b表对三条记录的关键字放到b表的pk中(依次),然后再置flag为0
2。对a表的数据随便修改两条(注意是一次性修改),那么b表也要把相应修改的关键字写到pk中,然后置flag为1
3。删除同理。。。
Top
8 楼zjcxc(邹建)回复于 2005-06-02 21:41:42 得分 0
修改a表的GBI_ID怎么办?Top
9 楼yeshucheng(叶澍成★七哥)回复于 2005-06-02 22:00:29 得分 0
修改a表的GBI_ID同时要放到b表的PK中Top
10 楼zjcxc(邹建)回复于 2005-06-02 22:10:20 得分 0
同时是什么意思? 举个例子。Top
11 楼yeshucheng(叶澍成★七哥)回复于 2005-06-02 22:18:03 得分 0
哈哈:)
Top
12 楼yeshucheng(叶澍成★七哥)回复于 2005-06-02 22:24:20 得分 0
我晚上有点糊涂了:)
create trigger tr_updprocess on BM_Goodsbasicinfo
for update,insert,delete
as
if update(mingcheng)
insert into chufaqi select GBI_ID,'1' from inserted
go
以上的是修改Top
13 楼yeshucheng(叶澍成★七哥)回复于 2005-06-03 08:29:30 得分 0
如果这样写:
create trigger tr_updprocess on BM_Goodsbasicinfo
for insert
as
if update(mingcheng)
insert into chufaqi select GBI_ID,'0' from inserted
会造成:如果修改了相关的mingcheng字段,那么触发器就能起作用。但是如果我修改的字段没有mingcheng这一项,那么出发器就不能起作用。
现在的问题是,只要我对表中的相关字段修改了,触发器就能起作用该怎么做?Top
14 楼zjcxc(邹建)回复于 2005-06-03 08:30:40 得分 0
--就是按你自己写的嘛
create trigger tr_updprocess on BM_Goodsbasicinfo
for update ---修改是update
as
if update(mingcheng)
insert into chufaqi select GBI_ID,'0' from insertedTop
15 楼yeshucheng(叶澍成★七哥)回复于 2005-06-03 08:45:18 得分 0
但是,上面只能对修改了mingcheng 字段起修改的记录啊?
BM_Goodsbasicinfo(mingcheng,address,zip)
|
单独修改它才起触发作用
如果单独修改address或者是单独修改ZIP,触发就不能起作用Top
16 楼yeshucheng(叶澍成★七哥)回复于 2005-06-03 09:23:18 得分 0
现在根据你的方法,新增删除都成功,但是修改还有问题:
由于问题是我对表BM_Goodsbasicinfo修改一条记录的同时都要在表chufaqi中新增一条记录并且置上标志位Top
17 楼zjcxc(邹建)回复于 2005-06-03 09:29:20 得分 0
create trigger tr_updprocess on BM_Goodsbasicinfo
for update ---修改是update
as
if update(mingcheng) or update(address) or update(zip) --用or可以指定要触发的多个列
insert into chufaqi select GBI_ID,'0' from inserted
Top
18 楼yeshucheng(叶澍成★七哥)回复于 2005-06-03 09:40:36 得分 0
你的QQ多少?好象很难描述我的这个问题:)
我的号是;56076621,你加我好了Top
19 楼yeshucheng(叶澍成★七哥)回复于 2005-06-03 09:53:01 得分 0
能否把新增,修改,删除写在一起?
我试了,好象按照这样写会有问题:修改不能进行
create trigger tr_process on BM_Goodsbasicinfo
for update,insert,delete
as
if exists(select * from inserted)
if update(mingcheng)
insert into chufaqi select GBI_ID,'1' from inserted
else
insert into chufaqi select GBI_ID,'0' from inserted
else
insert into chufaqi select GBI_ID,'2' from deleted
还望指正!!!
Top
20 楼zjcxc(邹建)回复于 2005-06-03 09:54:25 得分 0
create trigger tr_process on BM_Goodsbasicinfo
for update,insert,delete
as
if exists(select * from inserted)
if exists(select * from deleted) and(update(mingcheng) or update(address) or update(zip)) --修改
insert into chufaqi select GBI_ID,'1' from inserted
else --新增
insert into chufaqi select GBI_ID,'0' from inserted
else --删除
insert into chufaqi select GBI_ID,'2' from deleted
Top
21 楼wu_zhijun(wuzhijun)回复于 2005-06-03 10:23:30 得分 0
这样就写死了呀!如果要写成动态的话要怎么写呢?Top
22 楼zjcxc(邹建)回复于 2005-06-03 10:51:19 得分 0
怎么动态法?Top





