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 に答える