首先來看一下觸發器的語法:
use [資料庫名]
goset ansi_nulls on
goset quoted_identifier on
go建立或修改(create|alter) trigger 觸發器名(最好以***x_tr命名規範結尾)
on表名
for 對於什麼操作觸發(insert,update,delete )
asbegin
觸發後要做的操作
end講到觸發器,當然少不了要提一下inserted和deleted表,
deleted 與inserted分別表示觸發事件的表「舊的一條記錄」和「新的一條記錄」。乙個資料庫系統中有兩個虛擬表用於儲存在表中記錄改動的資訊,分別是:
虛擬表inserted 虛擬表deleted
在表記錄新增時 存放新增的記錄 不儲存記錄
修改時 存放用來更新的新記錄 存放更新前的記錄
刪除時 不儲存記錄 存放被刪除的記錄
乙個insert 的過程可以看作為:生成的記錄到inserted表,
乙個delete的過程可以看作為:生成的記錄到deleted表,
乙個update 的過程可以看作為:生成新的記錄到inserted表,複製舊的記錄到deleted表
這兩個表在觸發器中很是重要,一定要理解和區分 他們的關係和作用!
這兩個表的結構和觸發器對應的表結構是相同的!
1 use [pd]
2 go
3 /****** object: trigger [dbo].[table_delete] script date: 06/10/2014 09:39:20 ******/
4 set ansi_nulls on
5 go
6 set quoted_identifier on
7 go
8 create trigger [dbo].[dayrunrecord20140528_delete]
9 on [dbo].[dayrunrecord20140528]
10 after delete
11 as
12 if @@rowcount = 0 --如果影響的行數為 0,則結束觸發器執行,避免占用資源
13 begin
14 return
15 end
16 else
17 begin
18 set nocount on;19 declare @operatedate datetime;20 declare @ipaddreass varchar(20);21 declare @hostname varchar(50);22 declare @loginame varchar(50);23 declare @content varchar(5000)24 declare @content_temp varchar(2000)25 declare @operatetable varchar(50);26 --獲取使用者新增內容(人員定位表的字段)
27 declare @id int;28 declare @minenumber int;29 declare @pepolenumber int;30 declare @routestation varchar(10);31 declare @routetime datetime;32 declare @dataflag int;33 declare @remark1 char(50);34 declare @worknumber varchar(50);35 declare @receivetime datetime;36 declare @enterflag int;37 declare @powerflag int;38 declare @devicedbid int;39 declare @tr_lastupdatetime datetime;40 declare @tr_guid uniqueidentifier;41 set @content = '';42 --宣告游標
43 declare mycursor cursor for
44 select * fromdeleted45 openmycursor46 fetch next from mycursor into @id,@minenumber,@pepolenumber,@routestation,@routetime,@dataflag,@remark1,@worknumber,@receivetime,@enterflag,@powerflag,@devicedbid,@tr_lastupdatetime,@tr_guid
47 while (@@fetch_status = 0)48 begin
49 set @content_temp = 'id='+convert(varchar,@id) +
50 ';minenumber='+convert(varchar,@minenumber)+
51 ';pepolenumber='+convert(varchar,@pepolenumber)+
52 ';routestation='+ @routestation +
53 ';routetime='+convert(varchar,@routetime)+
54 ';dataflag='+convert(varchar,@dataflag)+
55 ';remark1='+convert(varchar,@remark1) +
56 ';worknumber='+@worknumber+
57 ';receivetime'+convert(varchar,@receivetime)+
58 ';enterflag='+convert(varchar,@enterflag)+
59 ';powerflag='+convert(varchar,@powerflag)+
60 ';devicedbid='+convert(varchar,@devicedbid)+
61 ';tr_lastupdatetime='+convert(varchar,@tr_lastupdatetime)+
62 ';tr_guid='+convert(varchar(36),@tr_guid);63 if(@content<>'')64 begin
65 set @content = @content + '&' +@content_temp;66 end
67 else
68 begin
69 set @content = @content_temp;70 end
71 --將游標下移
72 fetch next from mycursor into @id,@minenumber,@pepolenumber,@routestation,@routetime,@dataflag,@remark1,@worknumber,@receivetime,@enterflag,@powerflag,@devicedbid,@tr_lastupdatetime,@tr_guid
73 end
74 --關閉游標
75 closemycursor76 --釋放游標
77 deallocatemycursor78 set @operatetable = 'dayrunrecord20140528';79 set @ipaddreass = convert(varchar,connectionproperty('client_net_address'));80 set @hostname = convert(varchar,host_name());81 set @operatedate = getdate();82 set @loginame = convert(varchar,(select system_user));83 --為日誌表新增資料
84 insert intoxjk_user_operatelog(operatetype,operatetable,operatecontent,operatedate,ipaddreass,hostname,username)85 values('刪除',@operatetable,@content,@operatedate,@ipaddreass,@hostname,@loginame);86 end
其實**雖然多,裡面實現的功能卻很簡單,就是遍歷deleted表中刪除的內容,並把這些內容拼接到乙個變數中,用於記錄成乙個日誌。
觸發器 mysql觸發器
觸發器是一種特殊的儲存過程,它在插入 刪除或修改特定表中的資料時觸發執行,它比資料庫本身標準的功能有更精細和更複雜的資料控制能力。和儲存過程一樣,很少使用。1 觸發器的作用 2 建立觸發器 建立測試環境 mysql create database test db query ok,1 row aff...
my sql 觸發器 mysql建立觸發器
首先,我們來了解一下什麼是觸發器,觸發器,就是在對一張表資料進行增 insert 刪 delete 改 update 的時候,為了保持資料的一致性,對別的表也要進行相應的資料修改。我們都知道mysql最後事務提交後,資料是會儲存到磁碟上的,那麼每次在insert,delete,update時候舊資料...
my sql 觸發器 MySQL檢視觸發器
檢視觸發器是指檢視資料庫中已經存在的觸發器的定義 狀態和語法資訊等。mysql 中檢視觸發器的方法包括 show triggers 語句和查詢 information schema 資料庫下的 triggers 資料表等。本節將詳細介紹這兩種檢視觸發器的方法。show triggers語句檢視觸發器...