時間:2024-02-08 11:17作者:下載吧人氣:19
在很多應用程序開發中,需要記錄某些數據表的歷史記錄或修改痕跡,以便日后出現數據錯誤時進行數據排查。這種業務需求,我們可以通過數據庫的觸發器來輕松實現歷史記錄功能。
本文以SQL Server 2005數據庫中的觸發器為例(因為手中的項目用的就是這個數據庫)
先簡單描述一下SQL Server觸發器。
SQL Server觸發器的inserted和deleted
SQL Server為每個觸發器都創建了兩個專用虛擬表:inserted表和deleted表。這兩個表由系統來維護,他們存在于內存中,而不是在數據庫中。這兩個表的結構總是與被該觸發器作用的表結構相同。觸發器執行完成后,與該觸發器相關的兩個表會被刪除(即在內存中銷毀)。
inserted表存放由執行insert或update語句而要想飆中插入的所有行;即:插入后或更新后的值。
deleted表存放由delete或update語句而要從表中刪除的所有行;即:刪除或更新錢的值。
SQL操作 | inserted表 | deleted表 |
---|---|---|
增加(insert)記錄 | 存放新增的記錄 | [不可用] |
修改(update)記錄 | 存放更新后的記錄 | 存放更新前的記錄 |
刪除(delete)記錄 | [不可用] | 存放被刪除的記錄 |
SQL Server觸發器的instead of和after
SQL Server提供了兩種觸發器:instead of和after觸發器。這兩種觸發器的區別在于他們被激活的時機不同:
說(復制)了這么多,是因為我們要實現的功能需要用到inserted虛擬表、deleted虛擬表和after觸發器。
實現方法
通過一個示例來演示具體的實現方法。
假設當前有一個表:產品表(product),字段為“產品名(name)”、“產品描述(description)”、“單價(unit_cost)”和“生成日期(pub_time)”。
CREATE TABLE product(name VARCHAR(50),description VARCHAR(200),unit_cost MONEY,pub_time DATETIME)
GO
現在我們”上帝”的需求是:需要記錄product表發生數據變化(增、刪、改)時,記錄每次操作改動情況。
1.創建日志表
需要創建一個產品日志表(product_log)用來將記錄每次數據改動情況,我這里直接在原數據表的結構上增加兩個字段(在實際開發環境中,大家可以根據需求來設置日志表的表結構),分別為sqlcomm和exectime;代碼如下:
CREATE TABLE product_log(name VARCHAR(50),description VARCHAR(200),unit_cost MONEY,pub_time DATETIME,sqlcomm varchar(10),exectime datetime)
GO
網友評論