TRIGGER技术挑战!!!

xjbs 2002-04-14 06:53:48
/*批号库存记录表*/
CREATE TABLE A(
BH CHAR(4) NTO NULL,/*编号*/
ph char(6) not null,/*批号*/
sl numeric(8,2) default 0,/*数据*/

create unique index a_idx on a(bh,ph);
/*生产表*/
creatae table b(
bh char(4) not null,
ph char(6) not null,
jhsl numeric(8,2) default 0
)
create unique index b_idx on b(bh,ph);
当向B表有数据INSERT时,
INSERT INTO B SELECT ‘0001’,‘1999’,50
A表如下动作:
当A中有此编号和此批号数据时,则UPDATE更新SL,
如果A中没有些编号或批号数据,则INSERT此编号和批号数据,,
,,,,
当有成批的数据向B中INSERT时,,B上的TRIGGER怎么写???
...全文
75 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
pbdesigner 2002-04-19
  • 打赏
  • 举报
回复
yamato_fg(葡萄)提供的方法是可行的,但用游标处理大量记录时执行效率是个问题。fur16(小亚)的方法没有考虑到多记录,不全面。我提供的方法可以处理任何条记录,执行效率高,特别是对于海量数据。
“如果bh和ph以前在 a 中不存在,会不会出现置null值的现象”:不存在,如何会出现在更新列表中呢?对谁置空?isnull()正是对出现数据为空时的处理,保险点,实际上如果有缺省值时可省略。
0aaron 2002-04-19
  • 打赏
  • 举报
回复
up
jxc 2002-04-18
  • 打赏
  • 举报
回复
学习
fur16 2002-04-17
  • 打赏
  • 举报
回复
pbdesigner(MIS/ERP开发) :
这句话:
update a
set sl = isnull(sl,0) + t1.jhsl
from inserted t1,a
where t1.bh = a.bh and
t1.ph = a.ph
如果bh和ph以前在 a 中不存在,会不会出现置null值的现象, 据我所知,isnull()只能管到有记录但本字段为空的情况,
pbdesigner 2002-04-17
  • 打赏
  • 举报
回复
不好意思写错一个字.
create trigger ti_b on b
for insert as
update a
set sl = isnull(sl,0) + t1.jhsl
from inserted t1,a
where t1.bh = a.bh and
t1.ph = a.ph
insert into a(bh,ph,sl)
select bh,ph,jhsl
from inserted
where bh not in (select bh from a) or
ph not in (select ph from a)
rytoj 2002-04-17
  • 打赏
  • 举报
回复
有索引,并且查询条件与索引有关的情况下,不见得用not exist就非得遍历a表
rytoj 2002-04-17
  • 打赏
  • 举报
回复
批插入的情况下,trigger确实只会触发一次,但扬帆的做法正是适应这个要求的.唯一的是扬帆的做法不一定令AB表中编号批号完全同步,a表有时会比B表编号多.当然,这个可能不成问题.效率上单条插入扬帆和小亚的差不多,小亚的方法应该不适应批插(只会触发一次).感觉扬帆的还算最佳方法.
xjbs 2002-04-17
  • 打赏
  • 举报
回复
我在用的是‘小亚’的方法,,不过我认为太麻烦了,开销也大了,,
TigerHu 2002-04-16
  • 打赏
  • 举报
回复
u&p
iyiduhsoad 2002-04-16
  • 打赏
  • 举报
回复
同意楼上的。
如果是数据量很大的工作表,一是数据的移植,有trigger
做起来很麻烦。二是要保证数据的一致性,trigger吗?实在
不敢相信,还是用同一个事务来处理更安全有效。
至于trigger,用来控制简单的数据操作判断还是可以的。
enyuan 2002-04-16
  • 打赏
  • 举报
回复
为了程序的可移植,少用trigger...
pbdesigner 2002-04-16
  • 打赏
  • 举报
回复
实际上你的问题是如何处理多记录。下面我提供一种解决方案,无需游标,不用区分0条记录/1条记录/多条记录。
create trigger ti_b on b
for insert as
update a
set sl = isnull(sl,0) + t1.jhsl
from inserted t1,a
where t1.bh = a.bh and
t1.ph = a.ph
insert into a(bh,ph,sl)
select bh,ph,jhsl
from inserted
where bh not in (select bh from a) or
ph not in (select ph from b)


Yang_ 2002-04-16
  • 打赏
  • 举报
回复
各有各理解,trigger用不好确实祸害很大,因为trigger对数据的修改不是能立刻发现的,移植的考虑也是需要的,但是事务性、安全性的担心就多余了,trigger本身和触发它的语句是在同一个事务里的,如果触发器出错也会回滚触发它的语句。


LikePig 2002-04-15
  • 打赏
  • 举报
回复
mark
xjbs 2002-04-15
  • 打赏
  • 举报
回复
都要遍历一次A表,看来还是
: Yang_(扬帆破浪) 的好,,
yamato_fg 2002-04-15
  • 打赏
  • 举报
回复
CREATE TRIGGER tr_insertB ON B
FOR INSERT
AS
DECLARE @val1 varchar(30),@val2 varchar(30),@val3 numeric(8,2)
DECLARE cufeB CURSOR FOR SELECT bh,ph,jhsl from inserted

open cufeB
FETCH NEXT FROM cufeb INTO @val1,@val2,@val3

WHILE @@FETCH_STATUS = 0
BEGIN
IF EXISTS (SELECT * FROM a WHERE bh = @val1 AND ph = @val2 ) THEN
UPDATE a SET sl = @val3 WHERE bh = @val1 AND ph = @val2
ELSE
INSERT INTO a SELECT @val1,@val2,@val3

FETCH NEXT FROM cufeb INTO @val1,@val2
END

CLOSE cufeB
DEALLOCATE cufeB
fur16 2002-04-15
  • 打赏
  • 举报
回复
Yang_(扬帆破浪) 我认为你的考虑过于谨慎了,一般来说,出库入库是一个经常性的动作,即使某次操作使某种货物库存为零,但不排除还要进该种货物的可能,所以删除品种 应该不用在这里进行吧 嘻嘻
fur16 2002-04-15
  • 打赏
  • 举报
回复
CREATE TRIGGER tr_ins ON dbo.B
FOR inserted
AS
declare @BH CHAR(4)
declare @ph char(6)
declare @sl numeric(8,2)
declare @jhsl numeric(8,2)
declare @count int

begin tran
select @bh = bh ,@ph = ph ,@jhsl = jhsl from inserted

select @count = count(*) from A
where bh = @bh and ph = @ph

if @count = 0
insert into A
select @bh,@ph,@jhsl
else
begin
select @sl = sl from A where bh = @bh and ph = @ph
update A
set @sl = @jhsl + @sl
where where bh = @bh and ph = @ph
end

commit tran

试试看吧
xjbs 2002-04-15
  • 打赏
  • 举报
回复
结了,,谢谢各位,,
Yang_ 2002-04-14
  • 打赏
  • 举报
回复
“想必”的结论要试完了才知道!!
加载更多回复(5)

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧