最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年02月01日 16:21:23   投稿:mdxy-dxy  
在很多應(yīng)用程序開發(fā)中,需要記錄某些數(shù)據(jù)表的歷史記錄或修改痕跡,以便日后出現(xiàn)數(shù)據(jù)錯(cuò)誤時(shí)進(jìn)行數(shù)據(jù)排查。這種業(yè)務(wù)需求,我們可以通過數(shù)據(jù)庫的觸發(fā)器來輕松實(shí)現(xiàn)歷史記錄功能

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

本文以SQL Server 2005數(shù)據(jù)庫中的觸發(fā)器為例(因?yàn)槭种械捻?xiàng)目用的就是這個(gè)數(shù)據(jù)庫)

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

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

SQL Server為每個(gè)觸發(fā)器都創(chuàng)建了兩個(gè)專用虛擬表:inserted表和deleted表。這兩個(gè)表由系統(tǒng)來維護(hù),他們存在于內(nèi)存中,而不是在數(shù)據(jù)庫中。這兩個(gè)表的結(jié)構(gòu)總是與被該觸發(fā)器作用的表結(jié)構(gòu)相同。觸發(fā)器執(zhí)行完成后,與該觸發(fā)器相關(guān)的兩個(gè)表會(huì)被刪除(即在內(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ū)別在于他們被激活的時(shí)機(jī)不同:

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

說(復(fù)制)了這么多,是因?yàn)槲覀円獙?shí)現(xiàn)的功能需要用到inserted虛擬表、deleted虛擬表和after觸發(fā)器。

實(shí)現(xiàn)方法

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

假設(shè)當(dāng)前有一個(gè)表:產(chǎn)品表(product),字段為“產(chǎn)品名(name)”、“產(chǎn)品描述(description)”、“單價(jià)(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ù)變化(增、刪、改)時(shí),記錄每次操作改動(dòng)情況。

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

需要?jiǎng)?chuàng)建一個(gè)產(chǎn)品日志表(product_log)用來將記錄每次數(shù)據(jù)改動(dòng)情況,我這里直接在原數(shù)據(jù)表的結(jié)構(gòu)上增加兩個(gè)字段(在實(shí)際開發(fā)環(huán)境中,大家可以根據(jù)需求來設(shè)置日志表的表結(jié)構(gòu)),分別為sqlcomm和exectime;代碼如下:

CREATE TABLE product_log(name VARCHAR(50),description VARCHAR(200),unit_cost MONEY,pub_time DATETIME,sqlcomm varchar(10),exectime datetime)
GO

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

2.增加觸發(fā)器

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

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

CREATE TRIGGER tr_product_i
ON product
AFTER INSERT
AS
if @@rowcount = 0 --為了避免占用資源,當(dāng)影響行數(shù)為0時(shí),結(jié)束觸發(fā)器
 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

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

CREATE TRIGGER tr_product_u
ON product
AFTER UPDATE
AS
if @@rowcount = 0 --為了避免占用資源,當(dāng)影響行數(shù)為0時(shí),結(jié)束觸發(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 inserted
GO

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

CREATE TRIGGER tr_product_d
ON product
AFTER DELETE
AS
if @@rowcount = 0 --為了避免占用資源,當(dāng)影響行數(shù)為0時(shí),結(jié)束觸發(fā)器
 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.測(cè)試觸發(fā)器

插入(insert)測(cè)試

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

SELECT * FROM product
SELECT * FROM product_log
GO

更新(update)測(cè)試

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

SELECT * FROM product
SELECT * FROM product_log
GO

刪除(delete)測(cè)試

DELETE FROM product WHERE name='逗比'
GO

SELECT * FROM product
SELECT * FROM product_log
GO

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

相關(guān)文章

  • SQL查詢某列指定長(zhǎng)度的字符串多余的用省略號(hào)來表示

    SQL查詢某列指定長(zhǎng)度的字符串多余的用省略號(hào)來表示

    有時(shí)候?yàn)榱嗣烙^,只需要顯示前面幾個(gè)字符串,剩下的可以用省略號(hào)來表示,下面有個(gè)不錯(cuò)的示例,感興趣的朋友可以參考下
    2013-11-11
  • SQL中的partition分區(qū)功能使用詳解

    SQL中的partition分區(qū)功能使用詳解

    本文介紹了SQL中的分區(qū)功能,包括使用ROW_NUMBER()窗口函數(shù)和PARTITION BY進(jìn)行數(shù)據(jù)分組和排序,以及如何在創(chuàng)建表時(shí)進(jìn)行物理分區(qū)以優(yōu)化查詢性能,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • SQLSERVER服務(wù)手工啟動(dòng) 批處理文件

    SQLSERVER服務(wù)手工啟動(dòng) 批處理文件

    裝完SQLSERVER2005 因?yàn)殚_機(jī)很慢 所以呢就把開機(jī)服務(wù)搞成手動(dòng)的了,這樣開機(jī)快了很多可是問題也來了每次要用SqlServer的時(shí)候要一個(gè)一個(gè)服務(wù)去開起來
    2011-03-03
  • SqlServer身份驗(yàn)證登錄配置的實(shí)現(xiàn)步驟

    SqlServer身份驗(yàn)證登錄配置的實(shí)現(xiàn)步驟

    SQL?Server身份驗(yàn)證是一種用于驗(yàn)證用戶身份的方法,本文主要介紹了SqlServer身份驗(yàn)證登錄配置,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • SQL Server在AlwaysOn中使用內(nèi)存表的“踩坑”記錄

    SQL Server在AlwaysOn中使用內(nèi)存表的“踩坑”記錄

    這篇文章主要給大家介紹了關(guān)于SQL Server在AlwaysOn中使用內(nèi)存表的一些"踩坑"記錄,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)下吧。
    2017-09-09
  • 優(yōu)化 SQL Server 索引的小技巧

    優(yōu)化 SQL Server 索引的小技巧

    SQL Server中有幾個(gè)可以讓你檢測(cè)、調(diào)整和優(yōu)化SQL Server性能的工具
    2012-08-08
  • SQL Server 分頁查詢通用存儲(chǔ)過程(只做分頁查詢用)

    SQL Server 分頁查詢通用存儲(chǔ)過程(只做分頁查詢用)

    這段存儲(chǔ)過程寫得SQL代碼很不錯(cuò),在這個(gè)基礎(chǔ)上,按照我的習(xí)慣以及思維方式,調(diào)整了代碼,只做分頁查詢用
    2014-07-07
  • mssql 建立索引

    mssql 建立索引

    假設(shè)你想找到本書中的某一個(gè)句子。你可以一頁一頁地逐頁搜索,但這會(huì)花很多時(shí)間。而通過使用本書的索引,你可以很快地找到你要搜索的主題。
    2009-04-04
  • 安裝SQL?Server2019詳細(xì)教程(推薦!)

    安裝SQL?Server2019詳細(xì)教程(推薦!)

    SQL Server數(shù)據(jù)庫是Microsoft開發(fā)設(shè)計(jì)的一個(gè)關(guān)系數(shù)據(jù)庫智能管理系統(tǒng)(RDBMS),現(xiàn)在是全世界主流數(shù)據(jù)庫之一,下面這篇文章主要給大家介紹了關(guān)于安裝SQL?Server2019詳細(xì)教程,需要的朋友可以參考下
    2022-11-11
  • 使用 SQL 服務(wù)器時(shí),

    使用 SQL 服務(wù)器時(shí),"評(píng)估期已過期"錯(cuò)誤消息(解決方法)

    這篇文章主要介紹了使用 SQL 服務(wù)器時(shí),"評(píng)估期已過期"錯(cuò)誤消息,本文分步驟給大家分享解決方法,需要的朋友可以參考下
    2019-12-12

最新評(píng)論

绍兴县| 威海市| 乐至县| 珲春市| 泉州市| 博兴县| 随州市| 颍上县| 甘洛县| 阿瓦提县| 安西县| 茂名市| 新竹市| 桐乡市| 邵武市| 满洲里市| 凌源市| 枝江市| 洛隆县| 连州市| 卢湾区| 瑞金市| 彭山县| 和林格尔县| 佛冈县| 老河口市| 民县| 宁阳县| 龙江县| 肥乡县| 三穗县| 内乡县| 长宁区| 南皮县| 镇远县| 齐河县| 宜丰县| 麦盖提县| 新密市| 蒙阴县| 天水市|