我的触发器:
ALTER TRIGGER [Trig_Update]
ON [dbo].[Zc_Goods]
for update
AS
declare @goodsname nvarchar(50),@goodstype nvarchar(50),@goodsunit nvarchar(50),@goodsnum nvarchar(50),@remark nvarchar(50)
select @goodsname=[GoodsName],@goodstype=[GoodsType],@goodsunit=[GoodsUnit],@goodsnum=[GoodsNum],@remark=[GoodsRemark] from inserted
BEGIN
INSERT INTO [ZcStore].[dbo].[Zc_InStock]
(
[AddTime]
)
VALUES
(
CONVERT(varchar(100), GETDATE(), 25)
)
END
这样写能够执行。
当我添加多行时,也就是:
INSERT INTO [ZcStore].[dbo].[Zc_InStock]
(
[NameKind]
,[Name]
,[Ggxh]
,[Dw]
,[Num]
,[AddTime]
,[Remark])
VALUES
(@goodsname,@goodstype,@goodsunit,@goodsnum,CONVERT(varchar(100), GETDATE(), 25),@remark)
就会出现:超出存储过程、函数、触发器或视图的最大嵌套层数
请问哪位能帮我解决一下,小弟实在是搞不明白!
应该是多个触发器相互影响造成的,你看看关于Zc_InStock的触发器有没有操作Zc_Goods
估计是多个触发器出现迭代调用。
尽管触发器是一种存储过程,但是不能使用Execute 语句调用它, 如果有希望共享触发器和正常的存储过程的编码,那么只需把共享代码放在存储过程中,从触发器中调用它。如果一个触发器修改一个表,那么这些修改可能会激活 另一个触发器,或者本身。在默认情况下,SQL Sever 允许这种嵌套的触发器调用深度为32层。虽然我们建议允许嵌套的和叠代的触发器,但是可以使用系统存储过程禁止这么做。下面的语句在指定的数据库上防止叠代触发器:
sp_dboption AppDta,`recursive triggers',`false'
为了在所有数据库中防止嵌套触发器调用(包括叠代调用),可以使用下面的语句:
sp_configure `nested triggers',0
http://www.cnblogs.com/downmoon/archive/2007/12/29/1019663.html
ALTER TRIGGER [Trig_Update]
ON [dbo].[Zc_Goods]
for update
@goodsname nvarchar(50),
@goodstype nvarchar(50),
@goodsunit nvarchar(50),
@goodsnum nvarchar(50),
@remark nvarchar(50)
AS
BEGIN
select @goodsname=[GoodsName],@goodstype=[GoodsType],@goodsunit=[GoodsUnit],@goodsnum=[GoodsNum],@remark=[GoodsRemark] from inserted
END
GO;
INSERT INTO [ZcStore].[dbo].[Zc_InStock]
(
[NameKind]
,[Name]
,[Ggxh]
,[Dw]
,[Num]
,[AddTime]
,[Remark])
VALUES
(@goodsname,@goodstype,@goodsunit,@goodsnum,CONVERT(varchar(100), GETDATE(), 25),@remark)