2018年4月3日火曜日

メッセージ 217、レベル 16、状態 1、プロシージャ tri_SetB、行 5 [バッチ開始行 24] ストアド プロシージャ、関数、トリガー、またはビューの入れ子のレベルが最大値を超えました (制限 32)。メッセージ 195、レベル 15、状態 5、行 33 'RECURSIVE_TRIGGERS' は SET オプション として認識されません。

create table TriggerTest(id int, a int, b int)

drop trigger if exists tri_SetA
go
create trigger tri_SetA on TriggerTest after update as
begin
if update(a)
begin
update TriggerTest set b = a + 10000
where id in (select id from inserted)
end
end
go
drop trigger if exists tri_SetB
go
create trigger tri_SetB on TriggerTest after update as
begin
if update(b)
begin
update TriggerTest set a = b + 100000000
where id in (select id from inserted)
end
end
go

delete from TriggerTest
insert TriggerTest values(1,2,3),(2,3,4)

/*
メッセージ 217、レベル 16、状態 1、プロシージャ tri_SetB、行 5 [バッチ開始行 24]
ストアド プロシージャ、関数、トリガー、またはビューの入れ子のレベルが最大値を超えました (制限 32)。
*/

--これが全く使えない
SET RECURSIVE_TRIGGERS ON
/*
メッセージ 195、レベル 15、状態 5、行 33
'RECURSIVE_TRIGGERS' は SET オプション として認識されません。
*/
exec sp_configure 'show advanced options', 1
go
reconfigure --sp_configureの設定内容を反映させる
go

exec sp_configure 'nested triggers', 1
go
reconfigure
go

begin tran
select * from TriggerTest
update TriggerTest set a = a + 10 where id = 1
select * from TriggerTest
rollback tran

begin tran
select * from TriggerTest
update TriggerTest set b = b + 10 where id = 2
select * from TriggerTest
rollback tran