使用 Trigger 防止誤刪交易資料表的作法

筆者遇到資料庫每月的交易資料,在未知狀況下會莫名的遺失,經查所有程式、預存程序…等均找不到這段誤刪資料的程序。
由於找不到發生的源頭,只好從資料庫自身做一層手動的防護措施,以 Trigger 加上另一個資料表做為判斷是否允許進行刪除資料控制。
首先建立一個資料表(CONFIG_FLAG) 來控制是否可刪除資料,
資料就一個欄位FLAG varchar(1)
並在原交易資料表中(M_ARRIVE) 新增一個Trigger,依旗標欄位判定是否可刪除。
/*==================================================
description: 刪除[M_ARRIVE]資料表, 會觸發檢查是否可以執行
author: Robin
date: 2012/05/25
testing code:
---------------------------------------------------
==================================================*/
CREATE TRIGGER INSTEADOF_TR_DELETE_M_ARRIVE
ON M_ARRIVE
INSTEAD OF DELETE AS
BEGIN

IF EXISTS(SELECT FLAG FROM M_ARRIVE_FLAG WHERE FLAG='1')
BEGIN
    DELETE M_ARRIVE where issue_y+issue_m in (select issue_y+issue_m from deleted);
    RETURN;
END

RAISERROR (N'資料表 M_ARRIVE 的目前不是可以刪除的狀態',16, 1)

END
對原交易資料表執行刪除的步驟:
  1. 當我們所知道到程式中要進行刪除前,須先將此資料表FLAG設定為 1。
  2. 進行資料表刪除動作。
  3. 將FLAG設定為 0 ,以防其他程序誤刪。

參考資料

Using INSTEAD OF triggers in SQL Server for DML operations

http://www.mssqltips.com/sqlservertip/1804/using-instead-of-triggers-in-sql-server-for-dml-operations/