MySQL觸發(fā)器的使用和inserted和deleted表介紹
背景
最近在項目中有需求是當(dāng)人員表中有變動時(比如:增加人員、修改人員信息、刪除人員信息)需要把這張表中的變動的信息同步到它對應(yīng)的日志表中。那么如果用代碼寫邏輯的話在執(zhí)行效率上會比較慢,正好sqlserver提供了觸發(fā)器,我們可以利用觸發(fā)器進(jìn)行解決這個問題。
什么時sqlserver觸發(fā)器
觸發(fā)器是在對表進(jìn)行插入、更新或刪除操作時自動執(zhí)行的特殊存儲過程。觸發(fā)器通常用于強制業(yè)務(wù)規(guī)則,觸發(fā)器是一種高級約束,可以定義比CHECK約束更為復(fù)雜的約束:可以執(zhí)行復(fù)雜的SQL語句(if/while/case),可以引用其他表中的列。觸發(fā)器定義在特定的表上,與表相關(guān),自動觸發(fā)執(zhí)行,不能直接調(diào)用,是一個事務(wù)(可回滾)。
觸發(fā)器的種類
觸發(fā)器是在對表進(jìn)行增、刪、改操作才能夠觸發(fā)觸發(fā)器。這里分為after(之后)和instead of(之前)觸發(fā)。after觸發(fā)器要求只有執(zhí)行某一操作(insert、update、delete)之后觸發(fā)器才能被觸發(fā),且只能定義在表上。而instead of觸發(fā)器表示并不執(zhí)行其定義的操作(insert、update、delete)而僅是執(zhí)行觸發(fā)器本身,其優(yōu)先級高于觸發(fā)語句的執(zhí)行。
觸發(fā)器的使用
以下內(nèi)容介紹after之后的觸發(fā)器。以navicat工具為例。
首先我們需要監(jiān)測哪個數(shù)據(jù)庫就在哪個數(shù)據(jù)庫創(chuàng)建觸發(fā)器。比如:需要監(jiān)聽人員表中的數(shù)據(jù)變化,那么就需要在人員表中添加觸發(fā)器。點擊表的設(shè)計,找到觸發(fā)器
在上方點擊添加觸發(fā)器,并設(shè)置觸發(fā)器的名稱以及觸發(fā)的時間和在什么情況下觸發(fā)。
設(shè)置完這些之后可以去寫邏輯
首先介紹一下sql觸發(fā)器中兩個表,inserted和deleted??梢岳斫鉃檫@兩張表是臨時表,它的表字段和在哪個表中創(chuàng)建觸發(fā)器的字段是一致的,比如:我在人員管理表中添加了觸發(fā)器,那么inserted表和deleted表中的字段是一致的。這兩張表是系統(tǒng)在內(nèi)存中創(chuàng)建的兩張表,不會存儲到數(shù)據(jù)庫中,且這兩張表是只讀的,不能修改數(shù)據(jù)。當(dāng)觸發(fā)器完成工作之后,這兩張表也會被刪除
表操作 | inserted表 | deleted表 |
insert | 存放新增的記錄 | 無 |
update | 存放新增的記錄 | 存放更新前的數(shù)據(jù) |
delete | 無 | 存放新增的數(shù)據(jù) |
舉例:
BEGIN -- if EXISTS (select * from deleted) //判斷deleted表中是否有數(shù)據(jù) declare @is_delete char(20) //定義變量 if EXISTS( select is_delete from inserted ) declare @userId varchar(20) declare @userName VARCHAR(20) declare @machineId VARCHAR(40) declare @operator_Id VARCHAR(20) declare @operator varchar(20) select @is_delete=is_delete,@userId=user_id,@userName=user_name,@machineId=machine_id,@operator_Id=update_user_id,@operator=update_user_name FROM inserted //給變量賦值 IF @is_delete=1 判斷條件 BEGIN insert into User_Management_Logs(user_id,user_name,act,machine_id,operator,operator_id) VALUES(@userId,@userName,'刪除用戶',@machineId,@operator,@operator_Id) //在哪張表中插入數(shù)據(jù) END END
到此這篇關(guān)于MySQL觸發(fā)器的使用和inserted和deleted表介紹的文章就介紹到這了,更多相關(guān)MySQL觸發(fā)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql中find_in_set()函數(shù)的使用及in()用法詳解
這篇文章主要介紹了mysql中find_in_set()函數(shù)的使用以及in()用法詳解,需要的朋友可以參考下2018-07-07MySQL服務(wù)器進(jìn)程CPU占用100%的解決方法
早上幫朋友一臺服務(wù)器解決了 Mysql cpu 占用 100% 的問題。稍整理了一下,將經(jīng)驗記錄在這篇文章里。2010-12-12mysql百萬數(shù)據(jù)表加索引優(yōu)化的方法
在大數(shù)據(jù)時代,隨著數(shù)據(jù)量的快速增長,對數(shù)據(jù)庫的索引優(yōu)化變得尤為重要,本文主要介紹了mysql百萬數(shù)據(jù)表加索引優(yōu)化的方法,感興趣的可以了解一下2024-02-02Mysql技術(shù)內(nèi)幕之InnoDB鎖的深入講解
這篇文章主要給大家介紹了關(guān)于Mysql技術(shù)內(nèi)幕之InnoDB鎖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12mysql 5.7.15 安裝配置方法圖文教程(windows)
這篇文章主要為大家詳細(xì)介紹了mysql 5.7.15 安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07