-
26-09-2019 - |
题
我想防止删除特定记录。此触发器适用于该特定记录。但是,其他记录在删除时仍然保留。为什么?
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
如何确保不符合上述条件的行按预期被删除?
解决方案
您有一个 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
其他提示
由于这是INSTEAD OF你仍然需要默认情况下执行删除操作。
不隶属于 StackOverflow