定義: 何為觸發器?在SQL Server裡面也就是對某一個表的一定的操作,觸發某種條件,從而執行的一段程式。觸發器是一個特殊的預存程序。
常見的觸發器有三種:分別應用於Insert , Update , Delete 事件。
我為什麼要使用觸發器?例如,這麼兩個表:
Create Table Student( --学生表 StudentID int primary key, --学号 .... )
Create Table BorrowRecord( --学生借书记录表 BorrowRecord int identity(1,1), --流水号 StudentID int , --学号 BorrowDate datetime, --借出时间 ReturnDAte Datetime, --归还时间 ... )
用到的功能有:
1.如果我更改了學生的學號,我希望他的借書記錄仍然與這個學生相關(也就是該學生已經畢業,我希望刪除他的學號的同時,也刪除它的借書記錄。
等等。
這時候可用到觸發器。對於1,創建一個Update觸發器:
Create Trigger truStudent
On Stu Student表中建立觸發器
for Update --且事件觸發)
begin
StudentID
From BorrowRecord br , Deleted d ,Inserted i .StudentID=d.StudentID
end
兩個臨時的表:Deleted , Inserted 。注意Deleted 與Inserted分別表示觸發事件的表格「舊的一筆記錄」與「新的一筆記錄」。
一個資料庫系統中有兩個虛擬表用於儲存表中記錄變更的資訊,分別是:
虛擬表Deleted
在表記錄新增時 存放新增的記錄 修改時存放用來更新的新紀錄 在儲存更新前的記錄
能然後刪除Student記錄並寫入新紀錄。
對於2,創建一個Delete觸發器
Create trigger trdStudent
On Student
for Delete
As
Delete BorrowRecord
From BorrowRecord br , Delted d
Where br.StudentID=d.StudentID
從這兩個例子我們可以看到了觸發器的關鍵:A.2個臨時的表;B.觸發機制。
SQL觸發器實例2
/*
建立虛擬測試環境,包含:表[捲菸庫存表],表[捲菸銷售表]。
請大家注意追蹤這兩個表格的數據,體會觸發器到底執行了什麼業務邏輯,對數據有什麼影響。
為了能更清晰的表述觸發器的作用,表結構存在資料冗餘,且不符合第三範式,這裡特此說明。
*/
USE Master
GO
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE
GO
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME = '捲菸銷售表')
DROP TABLE 捲菸銷售表
GO
--業務規則:銷售金額 = 銷售數量。
CREATE TABLE 捲菸銷售表
(
捲菸品牌 VARCHAR(40) PRIMARY KEY NOT NULL,
購貨商 VARCHAR(40)
銷售金額 MONEY NULL
)
GO
--業務規則:庫存金額 = 庫存數量 * 庫存單價 業務規則。
CREATE TABLE 捲菸庫存表
(
捲菸品牌 VARCHAR(40) PRIMARY KEY NOT NULL,
庫存)
GO
--建立觸發器,範例1
/*
建立觸發器[T_INSERT_捲菸庫存表],此觸發器較簡單。
說明: 每當[捲菸庫存表]發生 INSERT 動作,則引發此觸發器。
觸發器功能: 強制執行業務規則,確保插入的資料中,庫存金額 = 庫存數量 * 庫存單價。
注意: [INSERTED]、[DELETED]為系統表,無法建立、修改、刪除,但可呼叫。
重要: 這兩個系統表的結構同插入資料的表的結構。
*/
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'TR' AND NAME = 'T_INSERT_捲菸庫存表'))
CREATE TRIGGER T_INSERT_捲菸庫存表
ON 捲菸庫存表
FOR INSERT
AS
--提交事務處理
BEGIN TRANSACTION
--強制執行下列語句,保證業務規則
UPDATE 捲菸庫存表捲頁 (SELECT 捲菸品牌 from INSERTED)
COMMIT TRANSACTION
GO
/*
針對[捲菸庫存表],插入測試資料:
注意,第一條資料(紅塔山新勢力)中的資料符合第二條,
,第一條資料(紅塔山新勢力)中的資料符合第二條, 紅塔山人為峰)中,[庫存金額]空,不符合業務規則,
第三條資料(雲南映像)中,[庫存金額]不等於[庫存數量]乘以[庫存單價],不符合業務規則。
第四條數據庫存數量為0。
請注意插入資料後,檢查[捲菸庫存表]中的資料是否 庫存金額 = 庫存數量 * 庫存單價。
*/
INSERT INTO 捲菸庫存表(捲菸品牌,庫存數量,庫存單價,庫存金額)
SELECT '紅塔山新勢力',100,12,1200 UNION ALL山新勢力',100,12,1200 UNION ALL302山人山人為。
/*
結果集
RecordId 捲菸品牌 庫存數量 庫存單價 庫存金額
-------- ------------ -------- ------- -- -------
1 紅塔山新勢力 100 12.0000 1200.0000
2 紅塔山人為峰 100 22.0000
4 玉溪 0 30.0000 .0000
(所影響的行數為 4 行)
*/
--觸發器範例2
/*
建立觸發器[T_INSERT_捲菸銷售表],觸發器較複雜。
說明: 每當[捲菸庫存表]發生 INSERT 動作,則引發此觸發器。
觸發器功能: 實現業務規則。
業務規則: 如果銷售的捲菸品牌不存在庫存或庫存為零,則回傳錯誤。
否則則自動減少[捲菸庫存表]中對應品牌捲菸的庫存數量和庫存金額。
*/
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'TR' AND NAME = 'T_INSERT_L100,)5000DR7)777分制紙紙。
CREATE TRIGGER T_INSERT_捲菸銷售表
ON 捲菸銷售表
FOR INSERT
AS
BEGIN TRANSACTION
--檢查資料的合法性:已販售的捲菸是否有庫存,或庫存是否大於零
IF NOT EXISTS100(F8>捲菸數量捲菸數量紙匣 IN (SELECT 捲菸品牌 FROM INSERTED)
)
BEGIN
--回傳錯誤提示
RAISERROR('錯誤!此捲菸不存在庫存,不能販售。',16,1) 9996+
IF EXISTS (
SELECT 庫存數量
FROM 捲菸庫存表
WHERE 捲菸品牌 IN (SELECT 捲菸品牌 FROM)INEDEDMED即使元件庫存數量
--回傳錯誤提示
RAISERROR('錯誤!該捲菸庫存小於等於0,不能銷售。 UPDATE 捲菸銷售表
SET 銷售金額 = 銷售數量 * 銷售單價
WHERE 捲菸品牌 IN (SELECT 捲菸品牌 FROM INSERTED)
@B@BCHAR85(F8900(300083)p7(c ECT 捲菸品牌 FROM INSERTED)
DECLARE @銷售數量 MONEY
SET @銷售數量 = (SELECT 銷售數量 FROM INSERTED)
UPDATE 捲菸庫存表 )*庫存單價
WHERE 捲菸品牌 = @捲菸品牌
COMMIT TRANSACTION
GO
--請大家自行追蹤[捲菸庫存表]與[捲菸銷售表]的資料變更。
--針對[捲菸銷售表],插入第一條測試數據,此數據是正常的。
INSERT INTO 捲菸銷售表(捲菸品牌,購貨商,銷售數量,銷售單價,銷售金額)
SELECT '紅塔山新勢力','某購貨商',10,12,1200
GO
GO
GO
GO
GO
GO
GO
GO
GO 針對[捲菸銷售表],插入第二條測試數據,該數據 銷售金額 不等於 銷售單價 * 銷售數量。
--觸發器將自動更正數據,使 銷售金額 等於 銷售單價 * 銷售數量。
INSERT INTO 捲菸銷售表(捲菸品牌,購貨商,銷售數量,銷售單價,銷售金額)
SELECT '紅塔山人為峰','某購貨商',10,22,2000
GO
GO
GO
GO
GO
GO
GO
GO
GO
GO 針對[捲菸銷售表],插入第三條測試數據,該數據中的捲菸品牌在 捲菸庫存表中找不到對應。
--觸發器將報錯。
INSERT INTO 捲菸銷售表(捲菸品牌,購貨商,銷售數量,銷售單價,銷售金額)
SELECT '紅河V8','某購貨商',10,60,600
GO
伺服器: 訊息 50000,等級 16,狀態 1,流程 T_INSERT_捲菸銷售表,行 15
錯誤!該捲菸不存在庫存,不能銷售。
*/
--針對[捲菸銷售表],插入第三條測試數據,該數據中的捲菸品牌在 捲菸庫存表中庫存為0。
--觸發器將報錯。
INSERT INTO 捲菸銷售表(捲菸品牌,購貨商,銷售數量,銷售單價,銷售金額)
SELECT '玉溪','某購貨商',10,30,300
GO
GO
*伺服器: 訊息 50000,等級 16,狀態 1,過程 T_INSERT_捲菸銷售表,行 29
錯誤!該捲菸庫存小於等於0,不能銷售。
*/
--查詢資料
SELECT * FROM 捲菸庫存表
SELECT * FROM 捲菸銷售表
GO
/*
補充:
1、本範例主要透過一個簡單的業務規則實現來進行觸發器使用的說明,具體的要根據需要靈活處理;
2、關於觸發器要瞭解並運用好 INSERTED ,DELETED 兩個系統表;
3、本範例所建立的觸發器都是 FOR INSERT ,特定的語法可參考:
//////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// /////////////
Trigger語法
////////////////////////////////////////////////// ////////////////////////////////////////////////// ///////////////////////////
CREATE TRIGGER trigger_name
ON { table | view 觸發器
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ ]
AS
[ { IF UPDATE ( column )
[ { AND OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator COLUMNS_UPDATED ( ) { bitwise_operator COLUMNS_UPDATED ( ) { bitwise_operator COLUMNS_UPDATED ( ) { bitwise_operator COLUMNS_UPDA] k [ ...n ]
} ]
sql_statement [ ...n ]
}
}
4、關於觸發器,還要注意
(1)、DELETE 觸發器不能捕捉 TRUNCATE TABLE 語句。
(2)、觸發器中不允許以下 Transact-SQL 語句:
ALTER DATABASE CREATE DATABASE DISK INIT
DISK RESIZE DR
RESTORE LOG
(3)、觸發器最多可嵌套32 層。
*/
--修改觸發器
--實質上,是將 CREATE TRIGGER ... 修改為 ALTER TRIGGER ...即可。
--刪除觸發器
DROP TRIGGER xxx
GO
--刪除測試環境
DROP TABLE 捲菸庫存表 煙庫存表
GO
DROP TRIGGER T_INSERT _捲菸銷售表
GO
############################################################################################################################# #######################
觸發器的基礎與範例
:create trigger tr_name
on table/view
{ | [update][,][insert][,][delete]
[with encryption]
as {batch | if update (col_name) [{and|or} 觸發器名稱
2 on table/view :觸發器所作用的表。一個觸發器只能作用於一個表
3 for 和after :同義
4 after 與instead of :sql 2000新增項目afrer 與 instead of 的區別來觸發在表上
Instead of
代替了相應的觸發事件而被執行,既可以建立在表上也可以建立在視圖上
5 insert、update、delete:激活觸發器的三種操作,可以同時執行,也可選其一
6 if update (col_name):表示所執行的操作對指定列是否有影響,有影響,則啟動觸發器。此外,因為delete 操作只對行有影響,
所以如果使用delete操作就不能用這條語句了(雖然使用也不出錯,但是不能激活觸發器,沒意義)。
7 觸發器執行時用到的兩個特殊表:deleted ,inserted
deleted 和inserted 可以說是一種特殊的臨時表,是在進行激活觸發器時由系統自動生成的,其結構與觸發器作用的表格結構是一
樣的,只是存放 的資料有差異。
續
下面表格說明deleted 與inserted 資料的差異
deleted 與inserted 資料的差異
Inserted
存放進行insert和update 操作相當於先進行delete 再進行insert ,所以在進行update操作時,修改前的資料拷貝一條到deleted 表中,修改後
的資料在存到觸發器作用的表的同時,也同時產生一條拷貝到insered表中
/////////
在dbo.chl_lydj 上建立觸發器[TRIGGER admixture_receive_log]
用於更新
AS
開始
修改從插入的
中選擇@wtbh=wtbh更新ly_tzk設定djsfxg='已' 其中wtbh=@wtbh
end
if(從t_logsetup 選擇data_sfjl)='是'
開始
聲明@oldcjmc char (100) bhdate 聲明@oldzl char (20)
聲明@olddj char (10)
聲明@newcjmc char (100) 聲明@newzl char (20)
聲明@newdj char(10)
選擇@newcjmc= cjmc,@ newlyrq=lyrq,@ newbzbh=bzbh,@newzl=zl,@newdj=dj 來自插入
從t_modifyuser如果 @oldcjmc@new cjmc
t_modifylog (wtbh, mod_time, mod_table , mod_field, ori_value, now_value, mod_people) 值 jmc, @newcjmc, @xgr)
以
結束
///// /////修改時,直接把'create'改為'alter'即可
FOR 聲明 @dwbh char( 100) 聲明@sy f char(100) 聲明@dwgcbh char(100) 聲明@wtbh char(50)
money 聲明 @feiyong_sy money聲明 @dj char(20)
選擇@wtbh=wtbh、@clmc=clmc、@dwbh=dwbh、@syf =syf來自插入從feihao_bz選擇 @dj=dj,其中cl iyong_xf,@feiyong_sy =feiyong_sy來自gong Chengxinxi,其中dwgcbh =@dwbh
set @dj_1=convert(money ,@dj)
if @dj_1 0 @feiyong_xf=@feiyong_xf+@dj_1
設定 @feiyong_sy=@feiyong 更新ly_tzk 設定syf=@ dj where wtbh=@wtbh
update gong Chengxinxi set fe) end
else 更新 ly _tzk 設定 syf=convert(char , 0.0) 其中與tbh=@w
//////////////////////////////
建立觸發器[TRIGGER ly_tzk_syf_shanchu] ON dbo.dzk用於刪除
AS開始
聲明@clmc char(100) 聲明 @dwbh char(100) bhtbh@dwgccm c0005) 聲明 @feiyong_z money 聲明 @feiyong_xf money 聲明@feiyong_ sy money聲明@syf char(100) 聲明@syf_1 money
選擇@wtbh=wtbh 、@clmc=clmc 、@dwbh=dwbh 、@syf=syf 來自插入--選擇 @dj=dj 來自feihao_bz 其中clmc= @clmc
從gong Chengxinxi中選擇@feiyong_z=feiyong_z、@feiyong_xf=feiyong_xong、iy set @syf_1=convert( money) ,@syf) 如果@syf_1 0
開始
set @feiyong_sy=@feiyong_sy+@syf_1
與中更新 gong Chengxinxi_bhyfy =@dwbh
結束
結束

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Atom編輯器mac版下載
最受歡迎的的開源編輯器

禪工作室 13.0.1
強大的PHP整合開發環境