2016-11-29 31 views
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 

執行查詢

時210
delete from Sehirler where SehirId = 17 

雖然我試圖在第10行(semtmah_sil)只觸發一次語句,但我在上面的錯誤「Procedure ilce_sil,Line 10 [Batch Start Line 0]我的Recursive_triggers已關閉 關於如何解決它的任何建議?

+2

你的觸發器有多個主要邏輯上的缺陷。首先是你正在使用標量值,並假設只有一行被刪除。每次操作時,sql server中的觸發器都會觸發一次。這導致了第二個邏輯缺陷。您沒有在任何地方引用已刪除的虛擬表。你編碼的方式只會刪除Ilceler選擇的任何一行,並且這個問題會逐漸下降到你的邏輯的其餘部分。 –

+1

你爲什麼用這個觸發器?聽起來你最好使用設置爲級聯刪除的外鍵約束。爲什麼附近的觸發器會針對狀態發出刪除操作?這似乎沒有邏輯意義。這也造成了一個無限循環... –

+0

我試圖觸發一個鄰居刪除一次,爲了查詢那裏刪除其餘,@SeanLange。但是我忽略了提及要刪除的內容。讓我嘗試使用級聯刪除,謝謝 – Ismael123

回答

0

的邏輯是完全有缺陷,但我取得了我想要的東西使用級聯刪除感謝@JustinCave

相關問題