CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  应用实例

数据库基础:触发器问题,我想在gxZsbd表发生插入更新删除时触发一个存储过程aaa,该如何操作呢?

楼主558047(三个代表万睡!八荣八耻万睡!)2004-09-04 15:34:36 在 MS-SQL Server / 应用实例 提问

我在设计a表的时候,设计触发器  
  CREATE   TRIGGER   [tr_Zsbd]   ON   [dbo].[gxZsbd]    
  FOR   INSERT,   UPDATE,   DELETE    
  AS  
  exec   stroredproc   aaa  
  但是我向gxZsbd插入数据或者更改数据的时候  
  存储过程并没有执行阿,是不是在什么地方还要用语句调用这个触发器么?  
   
  问题点数:0、回复次数:30Top

1 楼558047(三个代表万睡!八荣八耻万睡!)回复于 2004-09-04 15:35:52 得分 0

更正:我在设计gxZsbd表的时候,设计触发器Top

2 楼pengda1i(冒牌大力 V0.4)回复于 2004-09-04 15:36:19 得分 0

CREATE   TRIGGER   [tr_Zsbd]   ON   [dbo].[gxZsbd]    
  FOR   INSERT,   UPDATE,   DELETE    
  AS  
  exec   aaa  
  go  
   
   
  不用调用  
   
  Top

3 楼558047(三个代表万睡!八荣八耻万睡!)回复于 2004-09-04 15:52:50 得分 0

我要执行的存储过程是这样的  
  CREATE   PROCEDURE   aaa   AS  
    insert   into   gxGdbe(GdbeId,GdbeDateB,GdbeDateE)  
    values(2,14,15)  
  GO  
  在查询分析器里面没问题  
  可是在程序里面,执行完gxZsbd的插入操作之后,  
  就提示出错:过程aaa没有参数,但却为该过程提供了参数Top

4 楼pengda1i(冒牌大力 V0.4)回复于 2004-09-04 16:08:33 得分 0

你的触发器代码?  
   
   
  Top

5 楼558047(三个代表万睡!八荣八耻万睡!)回复于 2004-09-04 16:10:07 得分 0

CREATE   TRIGGER   [tr_Zsbd]   ON   [dbo].[gxZsbd]    
  FOR   INSERT,   UPDATE,   DELETE    
  AS  
      exec     aaa  
  go  
  Top

6 楼pengda1i(冒牌大力 V0.4)回复于 2004-09-04 16:29:48 得分 0

这样改:  
  CREATE   TRIGGER   [tr_Zsbd]   ON   [dbo].[gxZsbd]    
  FOR   INSERT,   UPDATE,   DELETE    
  AS  
      set   nocount   on  
      exec     aaa  
  go  
   
  CREATE   PROCEDURE   aaa   AS  
    set   nocount   on  
    insert   into   gxGdbe(GdbeId,GdbeDateB,GdbeDateE)  
    values(2,14,15)  
  GO  
  Top

7 楼558047(三个代表万睡!八荣八耻万睡!)回复于 2004-09-04 16:31:44 得分 0

大力  
  能给我解释解释为什么要写set   nocount   on这句么?Top

8 楼558047(三个代表万睡!八荣八耻万睡!)回复于 2004-09-04 16:44:27 得分 0

问题依旧  
  我是通过程序中的如下代码实现insert_gxZsbd操作的  
        frmDataMdl->ZS_SchStoredProc->Close();  
        DataMdl->dsDbgMx->DataSet=frmDataMdl->ZS_SchStoredProc;  
        frmDataMdl->ZS_SchStoredProc->ProcedureName   =   "insert_gxZsbd";  
        frmDataMdl->ZS_SchStoredProc->Parameters->Clear();  
        frmDataMdl->ZS_SchStoredProc->Parameters->CreateParameter          
            ("@ZsbdMhT_50",ftFloat,pdInput,16,NULL);  
   
        frmDataMdl->ZS_SchStoredProc->Parameters->ParamByName(WideString                                
            ("@ZsbdNamePart_2"))->Value   =strNamePart;  
        frmDataMdl->ZS_SchStoredProc->ExecProc();      
        是Bcb代码,我估计应该是这里出了问题  
  Top

9 楼cnrealboy(中国男人)回复于 2004-09-04 17:58:50 得分 0

set   nocount   on     设置没有返回结果集。Top

10 楼gaodongsheng(东升)回复于 2004-09-04 19:42:25 得分 0

insert_gxZsbd是aaa这个存储吗?如果是它的话,它不需要参数啊!为什么要创建?  
  它该不会是那个触发器的名字吧,呵呵,触发器是不用手工调用的。Top

11 楼558047(三个代表万睡!八荣八耻万睡!)回复于 2004-09-05 13:57:16 得分 0

insert_gxZsbd是一个单独的存储过程,实现insert表gxZsbd的功能,是带有参数的。  
  Top

12 楼pengda1i(冒牌大力 V0.4)回复于 2004-09-05 15:10:00 得分 0

insert_gxZsbd存储过程也加  
  set   nocount   on      
   
   
  ps:我不是大力  
  Top

13 楼558047(三个代表万睡!八荣八耻万睡!)回复于 2004-09-05 15:25:57 得分 0

pengda1i(冒牌大力   V0.2)  
  我想知道为什么会出现这个问题呢?  
  因为执行插入表gxZsbd的存储过程的名字是insert_gxZsbd,这个存储过程是带有参数的存储过程,在程序执行的时候,会建立参数并赋值,就像我上面写的那段程序代码  
  如果insert_gxZsbd存储过程也加set   nocount   on,不会影响操作结果么Top

14 楼pengda1i(冒牌大力 V0.4)回复于 2004-09-05 15:59:10 得分 0

应该不会  
  你试下  
  Top

15 楼558047(三个代表万睡!八荣八耻万睡!)回复于 2004-09-05 16:10:04 得分 0

错误依旧Top

16 楼zjcxc(邹建)回复于 2004-09-05 16:32:11 得分 0

写出  
  表结构/触发器代码/存储过程代码/调用方式  
  Top

17 楼558047(三个代表万睡!八荣八耻万睡!)回复于 2004-09-05 16:54:24 得分 0

老大,你在呀  
  错误提示:过程aaa没有参数,但却为该过程提供了参数  
   
   
  ---触发器代码  
  CREATE   TRIGGER   [tr_Zsbd]   ON   [dbo].[gxZsbd]    
  FOR   INSERT,   UPDATE,   DELETE    
  AS  
      exec     aaa  
  go  
  ---表gxZsbd的结果  
  ZsbdId     ZsbdNamePart   ZsbdNumber       ....     等等,这个表应该没什么问题  
  ---表gxGdbe的结构  
        GdbeId       GdbeDateB       GdbeDateE  
   
   
  ---aaa存储过程代码  
  CREATE   PROCEDURE   aaa   AS  
    insert   into   gxGdbe(GdbeId,GdbeDateB,GdbeDateE)  
    values(2,14,15)  
  GO  
   
  ---我是通过程序(bcb代码)中的如下代码实现插入gxZsbd操作的  
        frmDataMdl->ZS_SchStoredProc->Close();  
        frmDataMdl->ZS_SchStoredProc->ProcedureName   =   "insert_gxZsbd";  
        frmDataMdl->ZS_SchStoredProc->Parameters->Clear();  
        frmDataMdl->ZS_SchStoredProc->Parameters->CreateParameter          
            ("@ZsbdMhT_50",ftFloat,pdInput,16,NULL);  
        .........  
        frmDataMdl->ZS_SchStoredProc->Parameters->ParamByName(WideString                                
            ("@ZsbdNamePart_2"))->Value   =strNamePart;  
        frmDataMdl->ZS_SchStoredProc->ExecProc();      
        我初步判断这个代码为存储过程insert_gxZsbd创建了参数并赋值,影响了触发器触发的  
        那个aaa的存储过程,因为aaa没有参数。  
   
   
  Top

18 楼zjcxc(邹建)回复于 2004-09-05 17:00:08 得分 0

应该是你bcb的问题吧?   你试试不创建触发器,看有没有问题.Top

19 楼558047(三个代表万睡!八荣八耻万睡!)回复于 2004-09-05 17:05:46 得分 0

不创建触发器没问题,aaa的存储过程在查询分析器里面也没问题  
  我就怀疑是bcb的代码问题  
  但是如果在bcb里面执行insert_gxZsbd,就一定要给它创建参数和参数赋值  
  我试一下在查询分析器里面做一个insert表gxZsbd的动作,是否还会出错Top

20 楼558047(三个代表万睡!八荣八耻万睡!)回复于 2004-09-05 17:09:10 得分 0

老大,不是bcb的问题  
  我没有取消触发器  
  我是这样测试的:  
  在查询分析器里面执行:  
  insert   into   gxZsbd(ZsbdNamePart,ZsbdNumberPart)   values(2,3)  
  仍然提示:过程aaa没有参数,但却为该过程提供了参数Top

21 楼558047(三个代表万睡!八荣八耻万睡!)回复于 2004-09-05 17:13:54 得分 0

在查询分析器里面单独执行aaa也没有任何问题Top

22 楼zjcxc(邹建)回复于 2004-09-05 17:23:23 得分 0

--测试  
   
  --表  
  create   table   gxZsbd(ZsbdId   int)  
  create   table   gxGdbe(GdbeId   int,GdbeDateB   int,GdbeDateE   int)  
  go  
   
  ---触发器代码  
  CREATE   TRIGGER   [tr_Zsbd]   ON   [dbo].[gxZsbd]    
  FOR   INSERT,   UPDATE,   DELETE    
  AS  
      exec     aaa  
  go  
  ---aaa存储过程代码  
  CREATE   PROCEDURE   aaa   AS  
    insert   into   gxGdbe(GdbeId,GdbeDateB,GdbeDateE)  
    values(2,14,15)  
  GO  
   
  --插入数据  
  insert   gxZsbd   select   1  
   
  --修改数据  
  update   gxZsbd   set   ZsbdId=1  
   
  --删除数据  
  delete   from   gxZsbd  
  go  
   
  --显示结果  
  select   *   from   gxZsbd  
  select   *   from   gxGdbe  
  go  
   
  --删除测试  
  drop   table   gxZsbd,gxGdbe  
  drop   proc   aaa  
   
  /*--测试结果  
   
  无法在   sysdepends   中添加当前存储过程所对应的行,因为缺少该存储过程所依赖的对象   'aaa'。仍将创建该存储过程。  
   
  (所影响的行数为   1   行)  
   
   
  (所影响的行数为   1   行)  
   
   
  (所影响的行数为   1   行)  
   
   
  (所影响的行数为   1   行)  
   
   
  (所影响的行数为   1   行)  
   
   
  (所影响的行数为   1   行)  
   
  ZsbdId              
  -----------    
   
  (所影响的行数为   0   行)  
   
  GdbeId             GdbeDateB       GdbeDateE        
  -----------   -----------   -----------    
  2                       14                     15  
  2                       14                     15  
  2                       14                     15  
   
  (所影响的行数为   3   行)  
  --*/Top

23 楼zjcxc(邹建)回复于 2004-09-05 17:23:51 得分 0

看清楚,查询分析器,用触发器调用存储过程是没有错的.  
   
  所以应该是你程序代码的问题.Top

24 楼558047(三个代表万睡!八荣八耻万睡!)回复于 2004-09-05 17:54:57 得分 0

肯定不是bcb的问题  
  因为在查询分析器里面执行也出错  
  应该是我的存储过程或者触发器有毛病Top

25 楼zjcxc(邹建)回复于 2004-09-05 18:08:15 得分 0

那你怎么解释我的测试没有问题?Top

26 楼zjcxc(邹建)回复于 2004-09-05 18:08:48 得分 0

当然,也有可能是其他触发器的错,而不是你帖出的,这种只能你自己检查了.Top

27 楼pengda1i(冒牌大力 V0.4)回复于 2004-09-05 18:10:25 得分 0

insert_gxZsbd代码并没有贴出  
   
  检查这个表是不是还有其他触发器  
  检查这个表的触发器代码是不适合你贴出的一模一样  
   
  老实说,这样的触发器没有实用价值,触发器调用存储过程的应用很少实用的  
  Top

28 楼558047(三个代表万睡!八荣八耻万睡!)回复于 2004-09-05 19:05:05 得分 0

pengda1i(冒牌大力   V0.2)  
  其实这个触发器调用的aaa只是一个测试而已,替代这个测试的aaa其实是一个计算的SQL语句,即使起到实时计算统计的作用的。Top

29 楼558047(三个代表万睡!八荣八耻万睡!)回复于 2004-09-06 08:40:08 得分 0

补充:  
  如果在不是gxZsbd的表上作触发器做相同的测试,则一切正常Top

30 楼558047(三个代表万睡!八荣八耻万睡!)回复于 2004-09-06 09:27:04 得分 0

再问各位老大:  
  难道触发器和表的结构有关系么?Top

相关问题

  • 触发器?!
  • 触发器
  • 触发器
  • 求触发器
  • 触发器
  • 触发器(ORACLE)!!!!!!!!!
  • 触发器(ORACLE)!!!!!!!!!
  • oracle 触发器??
  • 触发器!
  • 求触发器!!!

关键词

  • 存储过程
  • 代码
  • 分析器
  • 执行
  • 查询
  • 测试
  • bcb
  • gxzsbd
  • 触发器
  • gdbedateb

得分解答快速导航

  • 帖主:558047

相关链接

  • SQL Server类图书

广告也精彩

反馈

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