0

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

4

1 回答 1

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
于 2012-09-25T18:31:15.877 回答