请熟悉触发器的朋友帮我看看这个触发器
CREATE TRIGGER [tri_dev_daycheck_h] ON [dbo].[DEV_DAYCHECK_H]
FOR INSERT, UPDATE
AS
declare
@ln_prior_readnum numeric(8,2),
@OLDnum numeric(8,2),
@NEWnum numeric(8,2)
begin
if not exists(select * from inserted) --如果是删除
BEGIN
--删除其对应的设备日检体
delete dev_daycheck_b FROM DELETED D
where dev_daycheck_b.DEV_COD = D.DEV_COD and dev_daycheck_b.CHECK_DTE = D.CHECK_DTE and
dev_daycheck_b.CLASS_NO = D.CLASS_NO and dev_daycheck_b.DAYCHECK_TYP_COD = D.DAYCHECK_TYP_COD
--删除其对应的运行时间记录
delete dev_runtime_rec FROM DELETED D
where dev_runtime_rec.DEV_NO = D.DEV_COD and dev_runtime_rec.CHECK_DTE = D.CHECK_DTE and
dev_runtime_rec.CLASS_NO = D.CLASS_NO and dev_runtime_rec.DAYCHECK_TYP_COD = D.DAYCHECK_TYP_COD
END
elsE
BEGIN
--往月度设备运行时间中插入记录
SELECT @OLDNUM=D.LAST_RUN_NUM FROM DELETED D
SELECT @NEWNUM=I.LAST_RUN_NUM FROM INSERTED I
if (@OLDNUM is null) and not (@NEWNUM is null)
BEGIN
select @ln_prior_readnum=max(dev_maint_ini.LAST_RUN_NUM)
from dev_maint_ini,INSERTED I
where dev_maint_ini.DEV_NO = I.DEV_COD
if @NEWNUM < @ln_prior_readnum --换表了
set @ln_prior_readnum = 0
--把运行时间添加到表DEV_RUNTIME_REC 中
insert into dev_runtime_rec (dev_runtime_rec.DEV_NO,dev_runtime_rec.LAST_READ_NUM,CURR_READ_NUM,RUN_TIM_NUM,RECORD_DTE,CLASS_NO,CHECK_DTE,DAYCHECK_TYP_COD)
values (SELECT I.DEV_COD,@LN_PRIOR_READNUM,I.LAST_RUN_NUM,I.LAST_RUN_NUM - @LN_PRIOR_READNUM,getdate(),I.CLASS_NO,I.CHECK_DTE,I.DAYCHECK_TYP_COD FROM INSERTED I)
END
update dev_maint_ini set dev_maint_ini.LAST_RUN_NUM = I.LAST_RUN_NUM
from dev_maint_ini,inserted i
where dev_maint_ini.DEV_NO = I.DEV_COD
END
--EXCEPTION
-- WHEN NO_DATA_FOUND THEN
--raise_application_error(-20000,'此设备未初始化,请检查');
end
GO
-----------------------------------------------------------------------
1.想请各位提提意见,这个触发器我是从Oracle版本的改过来的,另外我对sql server触发器才在开始学,请各位看看我这样改过来是不是符合sql server触发器的编写习惯?
2.此外提示:
insert into dev_runtime_rec (dev_runtime_rec.DEV_NO,dev_runtime_rec.LAST_READ_NUM,CURR_READ_NUM,RUN_TIM_NUM,RECORD_DTE,CLASS_NO,CHECK_DTE,DAYCHECK_TYP_COD)
values (SELECT I.DEV_COD,@LN_PRIOR_READNUM,I.LAST_RUN_NUM,I.LAST_RUN_NUM - @LN_PRIOR_READNUM,getdate(),I.CLASS_NO,I.CHECK_DTE,I.DAYCHECK_TYP_COD FROM INSERTED I)
这一句有错,应该如何改呢?
3.sql server中的错误提示函数是什么?
高分相送.
问题点数:100、回复次数:7Top
1 楼irq001()回复于 2004-11-03 14:54:31 得分 0
2、insert into values中不能包含select子查询吧。
3、分析@@error返回的错误号,然后根据分析结果print或者select显示信息Top
2 楼ntchance(晶晶)回复于 2004-11-03 14:57:21 得分 0
insert 中可以包含select 子查询的吧,我好象看到有这方面例子的啊Top
3 楼irq001()回复于 2004-11-03 15:06:55 得分 50
insert into select 可以。但是insert into values(select..)不可以。而且insert into select插入的记录数不能保证只有一条。Top
4 楼ntchance(晶晶)回复于 2004-11-03 15:16:07 得分 0
谢谢irq001(跟分过不去),
我将value 关键词删掉后,编译通过.
另外你看我的触发器中的编写风格有什么问题没有?
就是不符合常理的地方???
呵呵,学习啊Top
5 楼zjcxc(邹建)回复于 2004-11-03 15:16:34 得分 10
同意楼上.Top
6 楼irq001()回复于 2004-11-03 15:17:15 得分 0
太复杂了,没看明白。抱歉:PTop
7 楼irq001()回复于 2004-11-03 15:26:31 得分 40
1、(1)起码应该每执行一句影响数据的操作(比如:update,insert)就检查一下错误号,避免哪句出现错误仍然执行。
(2)因为触发器会影响表的修改等操作,所以如果没有记录被影响时应该结束。
比如:
CREATE TRIGGER [tri_dev_daycheck_h] ON [dbo].[DEV_DAYCHECK_H]
FOR INSERT, UPDATE
AS
if @@rowcount<=0 ---如果没有被影响记录则退出触发器。
return 0
.....Top




