2017-01-28 77 views
1

我读触发器的一些代码。SQL Server的触发器,不允许删除行

CREATE TRIGGER No_DeleteCustomers 
ON Customers 
INSTEAD OF DELETE 
AS 
    IF @@ROWCOUNT = 0 
     RETURN 

    RAISERROR('No deleting allowed', 11, 1) 

但我很迷茫......不@@ROWCOUNT用于显示受影响的行数中的最后一条语句...这如何防止我从表中删除行?

+0

你是正确的,@@ ROWCOUNT用于检查返回的行数。触发器中的IF语句将检查结果是否有零个记录,然后执行RAISERROR语句。 RAISERROR语句将终止事务并返回消息'不允许删除'。这是阻止你删除行的原因。 – MayowaO

+0

我很好奇为什么这个触发器甚至存在。似乎可能拒绝删除桌面上的特权将是一个更好的主意。 – Xedni

+3

@Xedni当你对于大多数用户来说是正确的,一些用户(如SA)不能否认的任何特权,这样的触发可以帮助防止系统管理员错误地删除行(当然,没有什么能阻止他们从禁用触发,然后删除,但这不太可能会被错误发生...) –

回答

0

让我们通过触发的代码走行,在一次演示如何工作的:

IF @@ROWCOUNT = 0     -- if the number of rows to be deleted is 0 then... 
    RETURN       -- return 
            -- if still running... 
RAISERROR('No deleting allowed', 11, 1) -- raise an error to the caller 

希望这有助于!