2010-10-27 135 views
1

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

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 

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

+1

你在哪里提交事务?删除在哪里进行? – Oded 2010-10-27 20:12:31

回答

4

你有一个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 
3

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

+0

哦,我最近开始使用触发器,我不太熟悉! ;) – Sadegh 2010-10-27 20:24:30