2010-10-27 134 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