国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

利用SQL Server觸發(fā)器實現(xiàn)表的歷史修改痕跡記錄

2020-07-25 11:52:11
字體:
供稿:網(wǎng)友

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

本文以SQL Server 2005數(shù)據(jù)庫中的觸發(fā)器為例(因為手中的項目用的就是這個數(shù)據(jù)庫)

先簡單描述一下SQL Server觸發(fā)器。

SQL Server觸發(fā)器的inserted和deleted

SQL Server為每個觸發(fā)器都創(chuàng)建了兩個專用虛擬表:inserted表和deleted表。這兩個表由系統(tǒng)來維護,他們存在于內(nèi)存中,而不是在數(shù)據(jù)庫中。這兩個表的結構總是與被該觸發(fā)器作用的表結構相同。觸發(fā)器執(zhí)行完成后,與該觸發(fā)器相關的兩個表會被刪除(即在內(nèi)存中銷毀)。

inserted表存放由執(zhí)行insert或update語句而要想飆中插入的所有行;即:插入后或更新后的值。
deleted表存放由delete或update語句而要從表中刪除的所有行;即:刪除或更新錢的值。

SQL操作 inserted表 deleted表
增加(insert)記錄 存放新增的記錄 [不可用]
修改(update)記錄 存放更新后的記錄 存放更新前的記錄
刪除(delete)記錄 [不可用] 存放被刪除的記錄

SQL Server觸發(fā)器的instead of和after

SQL Server提供了兩種觸發(fā)器:instead of和after觸發(fā)器。這兩種觸發(fā)器的區(qū)別在于他們被激活的時機不同:

  • instead of觸發(fā)器用于替代引用觸發(fā)器執(zhí)行的sql語句。除表之外,instead of觸發(fā)器也可以用于視圖,用來擴展視圖可以支持更新操作。
  • after觸發(fā)器在一個inserted、update或delete語句之后執(zhí)行,進行約束檢查等動作都在after觸發(fā)器被激活之前發(fā)生。after觸發(fā)器只能用于數(shù)據(jù)表中。

說(復制)了這么多,是因為我們要實現(xiàn)的功能需要用到inserted虛擬表、deleted虛擬表和after觸發(fā)器。

實現(xiàn)方法

通過一個示例來演示具體的實現(xiàn)方法。

假設當前有一個表:產(chǎn)品表(product),字段為“產(chǎn)品名(name)”、“產(chǎn)品描述(description)”、“單價(unit_cost)”和“生成日期(pub_time)”。

CREATE TABLE product(name VARCHAR(50),description VARCHAR(200),unit_cost MONEY,pub_time DATETIME)
GO

現(xiàn)在我們”上帝”的需求是:需要記錄product表發(fā)生數(shù)據(jù)變化(增、刪、改)時,記錄每次操作改動情況。

1.創(chuàng)建日志表

需要創(chuàng)建一個產(chǎn)品日志表(product_log)用來將記錄每次數(shù)據(jù)改動情況,我這里直接在原數(shù)據(jù)表的結構上增加兩個字段(在實際開發(fā)環(huán)境中,大家可以根據(jù)需求來設置日志表的表結構),分別為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分別記錄執(zhí)行命令(insert、update和delete)和執(zhí)行時間

2.增加觸發(fā)器

在產(chǎn)品表增加觸發(fā)器,其目的是為了記錄表數(shù)據(jù)發(fā)生改變時記錄到product_log中。

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

CREATE TRIGGER tr_product_iON productAFTER INSERTASif @@rowcount = 0 --為了避免占用資源,當影響行數(shù)為0時,結束觸發(fā)器 returninsert into product_log (name,description,unit_cost,pub_time,sqlcomm,exectime) select name,description,unit_cost,pub_time,'insert',getdate() from insertedGO

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

CREATE TRIGGER tr_product_uON productAFTER UPDATEASif @@rowcount = 0 --為了避免占用資源,當影響行數(shù)為0時,結束觸發(fā)器 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 insertedGO

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

CREATE TRIGGER tr_product_dON productAFTER DELETEASif @@rowcount = 0 --為了避免占用資源,當影響行數(shù)為0時,結束觸發(fā)器 returninsert into product_log (name,description,unit_cost,pub_time,sqlcomm,exectime) select name,description,unit_cost,pub_time,'delete',getdate() from deletedGO

3.測試觸發(fā)器

插入(insert)測試

INSERT INTO product(name,description,unit_cost,pub_time) VALUES('逗比','這是一個逗比的測試數(shù)據(jù)',200.5,'1990-11-18')GOSELECT * FROM productSELECT * FROM product_logGO

更新(update)測試

UPDATE product SET unit_cost=250.0 WHERE name='逗比'GOSELECT * FROM productSELECT * FROM product_logGO

刪除(delete)測試

DELETE FROM product WHERE name='逗比'GOSELECT * FROM productSELECT * FROM product_logGO

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 武定县| 凌云县| 阿巴嘎旗| 新乡市| 鹿泉市| 安国市| 阿克| 宜州市| 台湾省| 巴彦淖尔市| 鲜城| 光山县| 定边县| 麻江县| 自贡市| 乃东县| 保山市| 蕉岭县| 通辽市| 会理县| 基隆市| 东阳市| 独山县| 定州市| 江山市| 舒兰市| 南召县| 岳阳县| 太康县| 兴安盟| 措勤县| 上虞市| 抚远县| 利津县| 稷山县| 于都县| 铁力市| 纳雍县| 广饶县| 额尔古纳市| 玉龙|