复杂得多然后这一点,但是这是基本的SQL服务器:删除行,如果没有约束错误
Person
表(ID,姓名,EMAILADDRESS)Salesperson
表(ID,PERSONID)CustomerServiceRep
表(ID,PERSONID)
杰夫是营业员(ID = 4)和customerservicerep(ID = 5)PERSONID = 1。
简单
Trigger on SalesPerson Table
AFTER DELETE
AS
DECLARE @personID int = (SELECT personID FROM deleted);
IF @personID IS NOT NULL
BEGIN TRY
DELETE FROM Person
WHERE Person.id = @personID;
END TRY
BEGIN CATCH
END CATCH
DELETE FROM SalesPerson WHERE id=4;
原因
消息3616,级别16,状态1
触发执行过程中出现错误而引发。该批次已被中止,并且用户事务(如果有的话)已被回滚。
我敢肯定,如果它存在某种约束,有一种更简单的方法可以不删除personID
。或者赶上约束。在可能使用相同表/约束(外键)的表/列更多时,查看可能存在的每个可能的表似乎是非常重复的并且可能更困难。
似乎它会摆脱与“杰夫”相关的一切。只想删除销售人员“jeff”,而不是customerservicerep“jeff”,如果“jeff”人仍然存在,因为“jeff”也是customerservicerep,则不要删除人员。我觉得应该有一个完整的更简单的方法来做到这一点,而不添加每个表可能有personID来检查它是否存在之前删除人“杰夫” – user2828970
@ user2828970,我会设置一个外键'人'和'SalesPerson'级联删除。'Person'和'CustomerServiceRep'之间没有级联的外键。如果有更多的引用'Person'的表,你需要为它们设置适当的级联动作的外键。 –
我明白这可以如何有用。 Cascade对我来说是一件新事物。虽然看,但我还没有看到如何使它不删除人,如果它存在于不同的表中。 SalesPerson和CustomerServiceRep表基本相等(不优先于每个表)。可以从customerServiceRep中移除“jeff”,就像从SalesPerson中移除一样,但如果仍然存在某个地方,则不应删除该人员。显然,用长的代码行可以检查。 – user2828970