【问题标题】:preventing a specific record from being deleted防止删除特定记录
【发布时间】:2010-10-27 20:09:39
【问题描述】:

我想防止删除特定记录。此触发器适用于该特定记录。但是,其他记录在被删除时仍然存在。为什么?

 ALTER TRIGGER [Globalization].[CountriesTracker] 
 ON [Globalization].[Countries] 
 INSTEAD OF DELETE
 AS 
 BEGIN
SET NOCOUNT ON;
IF ((Select COUNT(*) from [Deleted]
     Where [Deleted].[CountryId] = '36bd1536-fb56-4ec4-957e-1b3afde16c56') = 1)
BEGIN       
    RAISERROR('You can not delete this specific record!', 0, 0)
    ROLLBACK TRANSACTION
    RETURN
END
END

如何确保按预期删除不符合上述条件的行?

【问题讨论】:

  • 你在哪里提交交易?删除在哪里执行?

标签: sql-server triggers sql-server-2008-r2


【解决方案1】:

你有一个 INSTEAD OF 触发器,所以你需要一个实际的 DELETE。

我还考虑简单地过滤掉受保护的行,因为:

  • 您需要抛出错误吗?还是默默无视?
  • 包含受保护行的多行删除怎么办:中止整个行,还是删除其余行?

类似:

ALTER TRIGGER [Globalization].[CountriesTracker]  ON [Globalization].[Countries] 
 INSTEAD OF DELETE
 AS 
SET NOCOUNT ON;

DELETE
   CT
FROM
   [Globalization].[Countries] C
   JOIN
   DELETED D ON C.CountryId = D.CountryId
WHERE
    [Deleted].[CountryId] <> '36bd1536-fb56-4ec4-957e-1b3afde16c56'
 GO

【讨论】:

    【解决方案2】:

    因为这是 INSTEAD OF,所以您仍然需要对默认情况执行删除操作。

    【讨论】:

    • 哦,我最近开始使用触发器,但我不太熟悉! ;)