0
我有3代表狀態(sehir),市(ILCE)和街道(semtmah),並添加以下觸發器,這樣,當我刪除的狀態,與之相關的所有城市和街道應刪除超過了最大存儲過程,函數,觸發器或視圖嵌套級別(限制32)。
Create trigger [dbo].[sehir_sil]
on [dbo].[Sehirler]
instead of delete
as
begin
set nocount on
declare @id int
select @id = Sehirler.SehirId from Sehirler
delete from Ilceler where SehirId = @id
end
和
CREATE trigger [dbo].[ilce_sil]
on [dbo].[Ilceler]
instead of delete
as
begin
set nocount on
declare @id1 int
select @id1 = Ilceler.ilceId from Ilceler
delete from SemtMah where SemtMahId = (select top 1 SemtMahId from semtmah where ilceId = @id1 order by SemtMahId)
end
和
Create trigger [dbo].[semtmah_sil]
on [dbo].[SemtMah]
instead of delete
as
begin
set nocount on
declare @id2 int
declare @idsehir int
select @id2 = SemtMah.ilceId from SemtMah
select @idsehir = Ilceler.SehirId from Ilceler where ilceId = @id2
delete from SemtMah where ilceId in (select ilceId from Ilceler where SehirId = @idsehir)
delete from Ilceler where SehirId [email protected]
delete from Sehirler where SehirId = @idsehir
end
執行查詢
時210delete from Sehirler where SehirId = 17
雖然我試圖在第10行(semtmah_sil)只觸發一次語句,但我在上面的錯誤「Procedure ilce_sil,Line 10 [Batch Start Line 0]我的Recursive_triggers已關閉 關於如何解決它的任何建議?
你的觸發器有多個主要邏輯上的缺陷。首先是你正在使用標量值,並假設只有一行被刪除。每次操作時,sql server中的觸發器都會觸發一次。這導致了第二個邏輯缺陷。您沒有在任何地方引用已刪除的虛擬表。你編碼的方式只會刪除Ilceler選擇的任何一行,並且這個問題會逐漸下降到你的邏輯的其餘部分。 –
你爲什麼用這個觸發器?聽起來你最好使用設置爲級聯刪除的外鍵約束。爲什麼附近的觸發器會針對狀態發出刪除操作?這似乎沒有邏輯意義。這也造成了一個無限循環... –
我試圖觸發一個鄰居刪除一次,爲了查詢那裏刪除其餘,@SeanLange。但是我忽略了提及要刪除的內容。讓我嘗試使用級聯刪除,謝謝 – Ismael123