婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 利用SQL Server觸發器實現表的歷史修改痕跡記錄

利用SQL Server觸發器實現表的歷史修改痕跡記錄

熱門標簽:武漢AI電銷機器人 在電子版地圖標注要收費嗎 電銷機器人 深圳 地圖標注如何弄全套標 實體店地圖標注怎么標 股票配資電銷機器人 萬利達綜合醫院地圖標注點 外呼系統會封嗎 南京電銷外呼系統哪家好

在很多應用程序開發中,需要記錄某些數據表的歷史記錄或修改痕跡,以便日后出現數據錯誤時進行數據排查。這種業務需求,我們可以通過數據庫的觸發器來輕松實現歷史記錄功能。

本文以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觸發器。這兩種觸發器的區別在于他們被激活的時機不同:

  • instead of觸發器用于替代引用觸發器執行的sql語句。除表之外,instead of觸發器也可以用于視圖,用來擴展視圖可以支持更新操作。
  • after觸發器在一個inserted、update或delete語句之后執行,進行約束檢查等動作都在after觸發器被激活之前發生。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

新增的兩個字段sqlcomm和exectime分別記錄執行命令(insert、update和delete)和執行時間

2.增加觸發器

在產品表增加觸發器,其目的是為了記錄表數據發生改變時記錄到product_log中。

針對插入(insert)操作,增加名為tr_product_i的觸發器:

CREATE TRIGGER tr_product_i
ON product
AFTER INSERT
AS
if @@rowcount = 0 --為了避免占用資源,當影響行數為0時,結束觸發器
 return
insert into product_log (name,description,unit_cost,pub_time,sqlcomm,exectime)
 select name,description,unit_cost,pub_time,'insert',getdate() from inserted
GO

針對更新(update)操作,增加名為tr_product_u的觸發器:

CREATE TRIGGER tr_product_u
ON product
AFTER UPDATE
AS
if @@rowcount = 0 --為了避免占用資源,當影響行數為0時,結束觸發器
 return
/*更新前*/
insert into product_log (name,description,unit_cost,pub_time,sqlcomm,exectime)
 select name,description,unit_cost,pub_time,'update',getdate() from deleted
/*更新后*/
insert into product_log (name,description,unit_cost,pub_time,sqlcomm,exectime)
 select name,description,unit_cost,pub_time,'update',getdate() from inserted
GO

針對刪除(delete)操作,增加名為tr_product_d的觸發器:

CREATE TRIGGER tr_product_d
ON product
AFTER DELETE
AS
if @@rowcount = 0 --為了避免占用資源,當影響行數為0時,結束觸發器
 return
insert into product_log (name,description,unit_cost,pub_time,sqlcomm,exectime)
 select name,description,unit_cost,pub_time,'delete',getdate() from deleted
GO

3.測試觸發器

插入(insert)測試

INSERT INTO product(name,description,unit_cost,pub_time)
 VALUES('逗比','這是一個逗比的測試數據',200.5,'1990-11-18')
GO

SELECT * FROM product
SELECT * FROM product_log
GO

更新(update)測試

UPDATE product SET unit_cost=250.0 WHERE name='逗比'
GO

SELECT * FROM product
SELECT * FROM product_log
GO

刪除(delete)測試

DELETE FROM product WHERE name='逗比'
GO

SELECT * FROM product
SELECT * FROM product_log
GO

好了這篇文章就介紹到這了,需要的朋友可以參考一下。

您可能感興趣的文章:
  • 關于喜憂參半的SQL Server觸發器詳解
  • SQLSERVER對加密的存儲過程、視圖、觸發器進行解密(推薦)
  • SQL Server 使用觸發器(trigger)發送電子郵件步驟詳解
  • SQL Server實現用觸發器捕獲DML操作的會話信息【實例】
  • SQL Server:觸發器實例詳解
  • SqlServer觸發器詳解
  • SqlServer實現類似Oracle的before觸發器示例
  • SQL SERVER中各類觸發器的完整語法及參數說明
  • SQL SERVER 觸發器介紹
  • SQL Server誤區30日談 第4天 DDL觸發器就是INSTEAD OF觸發器
  • SQL Server 觸發器詳情

標簽:泰安 安徽 臺州 濟寧 汕頭 武威 廣東 濟源

巨人網絡通訊聲明:本文標題《利用SQL Server觸發器實現表的歷史修改痕跡記錄》,本文關鍵詞  利用,SQL,Server,觸發器,實現,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《利用SQL Server觸發器實現表的歷史修改痕跡記錄》相關的同類信息!
  • 本頁收集關于利用SQL Server觸發器實現表的歷史修改痕跡記錄的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 纳雍县| 大新县| 永丰县| 彭水| 博客| 湘潭市| 宁河县| 夹江县| 中山市| 庆城县| 永安市| 五峰| 丽水市| 申扎县| 阿克陶县| 阿克苏市| 招远市| 民勤县| 东阳市| 社旗县| 衡南县| 和顺县| 文化| 通化市| 耿马| 桐城市| 深州市| 紫金县| 上栗县| 泊头市| 丹江口市| 淮安市| 玉树县| 齐河县| 通海县| 晋宁县| 镇坪县| 玉溪市| 东乡县| 汉寿县| 渑池县|