数据库基础:触发器问题,我想在gxZsbd表发生插入更新删除时触发一个存储过程aaa,该如何操作呢?
我在设计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




