CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  应用实例

请熟悉触发器的朋友帮我看看这个触发器

楼主ntchance(晶晶)2004-11-03 14:37:15 在 MS-SQL Server / 应用实例 提问

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

相关问题

  • 帮我写个触发器?
  • 帮忙写个触发器?
  • 帮忙写个触发器!
  • 帮忙写个触发器!
  • tiantianpb,帮帮我,触发器的问题?
  • 触发器的编写,帮帮忙啊!
  • oracle触发器的问题?请帮忙!
  • 帮我看看这个触发器!!UPDATE!!
  • 关于触发器,大家帮看看~~
  • 帮忙设计一个触发器~~

关键词

  • runtime
  • check
  • daycheck
  • cod
  • dev
  • oldnum
  • typ
  • newnum
  • dte
  • rec

得分解答快速导航

  • 帖主:ntchance
  • irq001
  • zjcxc
  • irq001

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo