October 1, 2007 at 3:07 am
Hi,
I wrote the following trigger
CREATE TRIGGER trRestorder
ON eStore_CatalogProducts
FOR UPDATE
AS
UPDATE eStore_CatalogProducts
SET AvailableFrom = '2040-01-01'
WHERE CanBeOrdered = 'Nej'
AND StockValue <1;
GO
When I did an update with Query analyzer to test the trigger I got the error message
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).
Any suggestions?
Thanks,
Henrik
October 1, 2007 at 4:48 am
You need to set the nested triggers option of server configuration settings to 0 to stop the engine from executing the trigger recursively using the following snippet...
USE master;
GO
EXEC sp_configure 'nested triggers', '0';
RECONFIGURE WITH OVERRIDE;
--Ramesh
October 1, 2007 at 5:00 am
Thank you. It solved my problem.
October 2, 2007 at 8:13 am
It solved your problem, but I don't think it does what you want it to do. Your trigger is affecting EVERY ROW of the table regardless of which rows were updated. I would think you would only want to update the updated rows.
JimFive
October 3, 2007 at 2:55 am
You can also specify which columns to check for UPDATE on.
Then there will be no nested triggers at all!
CREATE TRIGGER trRestorder ON eStore_CatalogProducts
FOR UPDATE
AS
IF UPDATE(CanBeOrdered) OR UPDATE(StockValue)
UPDATEcp
SETcp.AvailableFrom = '20400101'
FROMeStore_CatalogProducts AS cp
INNER JOININSERTED AS i ON i.PkCol = cp.PkCol
WHEREi.CanBeOrdered = 'Nej'
AND i.StockValue < 1
GO
N 56°04'39.16"
E 12°55'05.25"
October 4, 2007 at 7:18 pm
You can also test the trigger recursion with function trigger_nestlevel (see BOL) and stop recursion when the nest level exceeds 0. This method is specific to 1 trigger only and does not affect the recursion of other triggers.
Cheers,
Win
October 16, 2007 at 8:26 am
I create a delete trigger in Table1, if ever i will delete certain record it will also delete that record in Table2. And in Table2 also i created a delete trigger which also performs the same as delete trigger in Table1. If you delete a certain record it will also delete that record in Table1. But when i delete certain record it will create an error "Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).". can you help me on this?
October 16, 2007 at 4:51 pm
In your TRIGGER at the begining
do something like this:
IF @@NESTED_LEVEL > 1
BEGIN
RETURN
END
* Noel
October 16, 2007 at 7:07 pm
I cannot judge whether your circular relationship between tables 1 and 2 is a good thing. To stop the recursion I would use Noeld's construct, but with function trigger_nestlevel( object_ID('triggername')).
In the trigger for table 1 use:
if trigger_nestlevel( object_ID('table_2_trigger')) > 1
return
In the trigger for table 2 use:
if trigger_nestlevel( object_ID('table_1_trigger')) > 1
return
@@nestlevel also counts active procedures. If your delete in table 1 is called by a general procedure (not a trigger) the trigger will terminate before it can carry out a cascading delete on table 2.
Cheers,
Win
October 18, 2007 at 6:06 am
thanks for the help
October 18, 2007 at 6:06 am
thanks for the help
November 25, 2008 at 12:18 pm
Thanks a lot for this post, It solved all the problems that I had with my Triggers and PROCs
Viewing 12 posts - 1 through 11 (of 11 total)
You must be logged in to reply to this topic. Login to reply
This website stores cookies on your computer.
These cookies are used to improve your website experience and provide more personalized services to you, both on this website and through other media.
To find out more about the cookies we use, see our Privacy Policy