मान लें कि आप अपना FOREIGN KEY
रख रहे हैं जगह में बाधा, आप समस्या को FOR DELETE
. में ठीक नहीं कर सकते चालू कर देना। FOR
ट्रिगर (जिसे AFTER
के रूप में भी जाना जाता है) ट्रिगर) आग बाद में गतिविधि हुई है। और एक विदेशी कुंजी रोक देगी हटाए जाने से एक पंक्ति यदि इसमें संदर्भ हैं। विदेशी कुंजी की जांच पहले . होती है हटाना।
आपको जो चाहिए वह है एक INSTEAD OF
चालू कर देना। आपको यह भी ध्यान में रखना होगा कि आपके वर्तमान ट्रिगर ने संदर्भ के केवल एक "स्तर" से निपटने का प्रयास किया है। (इसलिए, यदि पंक्ति 3 पंक्ति 2 और पंक्ति 2 संदर्भ पंक्ति 1 को संदर्भित करती है, और आप पंक्ति 1 को हटाते हैं, तो आपके ट्रिगर ने केवल पंक्ति 2 को निकालने का प्रयास किया है)
तो, कुछ इस तरह:
CREATE TRIGGER [dbo].[T_comment_Trigger]
ON [dbo].[Comments]
INSTEAD OF DELETE
AS
;WITH IDs as (
select id from deleted
union all
select c.id
from Comments c
inner join
IDs i
on
c.ParentID = i.id
)
DELETE FROM Comments
WHERE id in (select id from IDs);
यदि अन्य (गैर-स्व-संदर्भ) कैस्केडिंग विदेशी कुंजी बाधाएं हैं, तो उन सभी को इस ट्रिगर में क्रियाओं द्वारा प्रतिस्थापित किया जाना है। ऐसे मामले में, मैं उन सभी आईडी की सूची रखने के लिए एक टेबल वैरिएबल पेश करने की सलाह दूंगा जो अंततः Comments
से हटा दी जाएंगी। तालिका:
CREATE TRIGGER [dbo].[T_comment_Trigger]
ON [dbo].[Comments]
INSTEAD OF DELETE
AS
declare @deletions table (ID varchar(7) not null);
;WITH IDs as (
select id from deleted
union all
select c.id
from Comments c
inner join
IDs i
on
c.ParentID = i.id
)
insert into @deletions(ID)
select ID from IDs
DELETE FROM OtherTable
WHERE CommentID in (select ID from @deletions)
--This delete comes last
DELETE FROM Comments
WHERE id in (select ID from @deletions);