2012-09-25 92 views
0

有没有办法阻止删除表中的所有行?我知道如何使用DDL触发器来防止删除表格或截断。我曾经无法突出显示整个命令,将where子句关闭,并删除表中的所有行。除非存在where子句,否则我希望防止这种情况再次发生。防止删除表中的所有行

回答

3

你可以用触发器来做到这一点。

CREATE TRIGGER dbo.KeepRows 
ON dbo.TableName 
FOR DELETE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF NOT EXISTS (SELECT 1 FROM dbo.TableName) 
    BEGIN 
    RAISERROR('Naughty developer, you tried to delete the last row!', 11, 1); 
    ROLLBACK TRANSACTION; 
    END 
END 
GO 

为了避免删除,然后回滚,可以是如果表是大挺贵的,你可以改为实现这个作为替代触发器,这将阻止任何工作情况的发生(除了检查当然)。这是假设列id是主键:

CREATE TRIGGER dbo.KeepRows2 
ON dbo.TableName 
INSTEAD OF DELETE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF EXISTS (SELECT 1 FROM dbo.TableName WHERE id NOT IN (SELECT id FROM deleted)) 
    BEGIN 
    DELETE dbo.TableName WHERE id IN (SELECT id FROM deleted); 
    END 
    -- optional: 
    ELSE 
    BEGIN 
    RAISERROR('Nice try, you need a WHERE clause!', 11, 1); 
    END 
END 
GO 
+0

是否有使用列符号在代替实施例的方式,再次使用的假设,即列0将是PK即使没有命名的id? – UserBlueOne

+0

@UserBlueOne你是说你不知道列的名字?不,您需要*名称*作为主键/唯一键的列;你不能使用序位。我想你可以在两张桌子上执行一个“计数”,但我更愿意通过键确定。只要您的表都具有单列主键,这些触发器就可以非常容易地以自动方式生成。 –

+0

我会知道PK的名字,但只是好奇,如果可以使用序数值。 – UserBlueOne