テーブル内のすべての行が削除されないようにする方法はありますか? テーブルの削除や切り捨てを防ぐために DDL トリガーを使用する方法を知っています。コマンド全体を強調表示するのに失敗し、where 句を省略して、テーブル内のすべての行を削除したことがあります。where句が存在しない限り、これが再び発生するのを防ぎたいです。
1562 次
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 に答える