婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > SQL觸發器實例講解

SQL觸發器實例講解

熱門標簽:南京電銷外呼系統運營商 溫州語音外呼系統代理 山西語音外呼系統價格 重慶防封電銷機器人供應商 威海智能語音外呼系統 西安青牛防封電銷卡 智能語音外呼系統哪個牌子好 400電話申請需要開戶費嗎 北京辦理400電話多少
SQL觸發器實例1
定義: 何為觸發器?在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.如果我更改了學生的學號,我希望他的借書記錄仍然與這個學生相關(也就是同時更改借書記錄表的學號);
2.如果該學生已經畢業,我希望刪除他的學號的同時,也刪除它的借書記錄。
等等。
這時候可以用到觸發器。對于1,創建一個Update觸發器:
復制代碼 代碼如下:

Create Trigger truStudent
On Student --在Student表中創建觸發器
for Update --為什么事件觸發
As --事件觸發后所要做的事情
if Update(StudentID)
begin
Update BorrowRecord
Set StudentID=i.StudentID
From BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted臨時表
Where br.StudentID=d.StudentID
end

理解觸發器里面的兩個臨時的表:Deleted , Inserted 。注意Deleted 與Inserted分別表示觸發事件的表“舊的一條記錄”和“新的一條記錄”。
一個數據庫系統中有兩個虛擬表用于存儲在表中記錄改動的信息,分別是:
虛擬表Inserted 虛擬表Deleted
在表記錄新增時 存放新增的記錄 不存儲記錄
修改時 存放用來更新的新記錄 存放更新前的記錄
刪除時 不存儲記錄 存放被刪除的記錄
一個Update 的過程可以看作為:生成新的記錄到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 = 'U' AND NAME = '卷煙庫存表')
DROP TABLE 卷煙庫存表
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) NULL,
銷售數量 INT NULL,
銷售單價 MONEY NULL,
銷售金額 MONEY NULL
)
GO
--業務規則:庫存金額 = 庫存數量 * 庫存單價 業務規則。
CREATE TABLE 卷煙庫存表
(
卷煙品牌 VARCHAR(40) PRIMARY KEY NOT NULL,
庫存數量 INT NULL,
庫存單價 MONEY NULL,
庫存金額 MONEY NULL
)
GO
--創建觸發器,示例1
/*
創建觸發器[T_INSERT_卷煙庫存表],這個觸發器較簡單。
說明: 每當[卷煙庫存表]發生 INSERT 動作,則引發該觸發器。
觸發器功能: 強制執行業務規則,保證插入的數據中,庫存金額 = 庫存數量 * 庫存單價。
注意: [INSERTED]、[DELETED]為系統表,不可創建、修改、刪除,但可以調用。
重要: 這兩個系統表的結構同插入數據的表的結構。
*/
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'TR' AND NAME = 'T_INSERT_卷煙庫存表')
DROP TRIGGER T_INSERT_卷煙庫存表
GO
CREATE TRIGGER T_INSERT_卷煙庫存表
ON 卷煙庫存表
FOR INSERT
AS
--提交事務處理
BEGIN TRANSACTION
--強制執行下列語句,保證業務規則
UPDATE 卷煙庫存表
SET 庫存金額 = 庫存數量 * 庫存單價
WHERE 卷煙品牌 IN (SELECT 卷煙品牌 from INSERTED)
COMMIT TRANSACTION
GO
/*
針對[卷煙庫存表],插入測試數據:
注意,第一條數據(紅塔山新勢力)中的數據符合業務規則,
第二條數據(紅塔山人為峰)中,[庫存金額]空,不符合業務規則,
第三條數據(云南映像)中,[庫存金額]不等于[庫存數量]乘以[庫存單價],不符合業務規則。
第四條數據庫存數量為0。
請注意在插入數據后,檢查[卷煙庫存表]中的數據是否 庫存金額 = 庫存數量 * 庫存單價。
*/
INSERT INTO 卷煙庫存表(卷煙品牌,庫存數量,庫存單價,庫存金額)
SELECT '紅塔山新勢力',100,12,1200 UNION ALL
SELECT '紅塔山人為峰',100,22,NULL UNION ALL
SELECT '云南映像',100,60,500 UNION ALL
SELECT '玉溪',0,30,0
GO
--查詢數據
SELECT * FROM 卷煙庫存表
GO
/*
結果集
RecordId 卷煙品牌 庫存數量 庫存單價 庫存金額
-------- ------------ -------- ------- ---------
1 紅塔山新勢力 100 12.0000 1200.0000
2 紅塔山人為峰 100 22.0000 2200.0000
3 云南映像 100 60.0000 6000.0000
4 玉溪 0 30.0000 .0000
(所影響的行數為 4 行)
*/
--觸發器示例2
/*
創建觸發器[T_INSERT_卷煙銷售表],該觸發器較復雜。
說明: 每當[卷煙庫存表]發生 INSERT 動作,則引發該觸發器。
觸發器功能: 實現業務規則。
業務規則: 如果銷售的卷煙品牌不存在庫存或者庫存為零,則返回錯誤。
否則則自動減少[卷煙庫存表]中對應品牌卷煙的庫存數量和庫存金額。
*/
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'TR' AND NAME = 'T_INSERT_卷煙銷售表')
DROP TRIGGER T_INSERT_卷煙銷售表
GO
CREATE TRIGGER T_INSERT_卷煙銷售表
ON 卷煙銷售表
FOR INSERT
AS
BEGIN TRANSACTION
--檢查數據的合法性:銷售的卷煙是否有庫存,或者庫存是否大于零
IF NOT EXISTS (
SELECT 庫存數量
FROM 卷煙庫存表
WHERE 卷煙品牌 IN (SELECT 卷煙品牌 FROM INSERTED)
)
BEGIN
--返回錯誤提示
RAISERROR('錯誤!該卷煙不存在庫存,不能銷售。',16,1)
--回滾事務
ROLLBACK
RETURN
END
IF EXISTS (
SELECT 庫存數量
FROM 卷煙庫存表
WHERE 卷煙品牌 IN (SELECT 卷煙品牌 FROM INSERTED) AND
庫存數量 = 0
)
BEGIN
--返回錯誤提示
RAISERROR('錯誤!該卷煙庫存小于等于0,不能銷售。',16,1)
--回滾事務
ROLLBACK
RETURN
END
--對合法的數據進行處理
--強制執行下列語句,保證業務規則
UPDATE 卷煙銷售表
SET 銷售金額 = 銷售數量 * 銷售單價
WHERE 卷煙品牌 IN (SELECT 卷煙品牌 FROM INSERTED)
DECLARE @卷煙品牌 VARCHAR(40)
SET @卷煙品牌 = (SELECT 卷煙品牌 FROM INSERTED)
DECLARE @銷售數量 MONEY
SET @銷售數量 = (SELECT 銷售數量 FROM INSERTED)
UPDATE 卷煙庫存表
SET 庫存數量 = 庫存數量 - @銷售數量,
庫存金額 = (庫存數量 - @銷售數量)*庫存單價
WHERE 卷煙品牌 = @卷煙品牌
COMMIT TRANSACTION
GO
--請大家自行跟蹤[卷煙庫存表]和[卷煙銷售表]的數據變化。
--針對[卷煙銷售表],插入第一條測試數據,該數據是正常的。
INSERT INTO 卷煙銷售表(卷煙品牌,購貨商,銷售數量,銷售單價,銷售金額)
SELECT '紅塔山新勢力','某購貨商',10,12,1200
GO
--針對[卷煙銷售表],插入第二條測試數據,該數據 銷售金額 不等于 銷售單價 * 銷售數量。
--觸發器將自動更正數據,使 銷售金額 等于 銷售單價 * 銷售數量。
INSERT INTO 卷煙銷售表(卷煙品牌,購貨商,銷售數量,銷售單價,銷售金額)
SELECT '紅塔山人為峰','某購貨商',10,22,2000
GO
--針對[卷煙銷售表],插入第三條測試數據,該數據中的卷煙品牌在 卷煙庫存表中找不到對應。
--觸發器將報錯。
INSERT INTO 卷煙銷售表(卷煙品牌,購貨商,銷售數量,銷售單價,銷售金額)
SELECT '紅河V8','某購貨商',10,60,600
GO
/*
結果集
服務器: 消息 50000,級別 16,狀態 1,過程 T_INSERT_卷煙銷售表,行 15
錯誤!該卷煙不存在庫存,不能銷售。
*/
--針對[卷煙銷售表],插入第三條測試數據,該數據中的卷煙品牌在 卷煙庫存表中庫存為0。
--觸發器將報錯。
INSERT INTO 卷煙銷售表(卷煙品牌,購貨商,銷售數量,銷售單價,銷售金額)
SELECT '玉溪','某購貨商',10,30,300
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 }
[ WITH ENCRYPTION ] --用于加密觸發器
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ ...n ]
} ]
sql_statement [ ...n ]
}
}

4、關于觸發器,還應該注意
(1)、DELETE 觸發器不能捕獲 TRUNCATE TABLE 語句。
(2)、觸發器中不允許以下 Transact-SQL 語句:
ALTER DATABASE CREATE DATABASE DISK INIT
DISK RESIZE DROP DATABASE LOAD DATABASE
LOAD LOG RECONFIGURE RESTORE DATABASE
RESTORE LOG
(3)、觸發器最多可以嵌套 32 層。
*/
--修改觸發器
--實質上,是將 CREATE TRIGGER ... 修改為 ALTER TRIGGER ...即可。
--刪除觸發器
DROP TRIGGER xxx
GO
--刪除測試環境
DROP TABLE 卷煙庫存表
GO
DROP TABLE 卷煙銷售表
GO
DROP TRIGGER T_INSERT_卷煙庫存表
GO
DROP TRIGGER T_INSERT_卷煙銷售表
GO
##################################################################
觸發器的基礎知識和例子
:create trigger tr_name
on table/view
{for | after | instead of } [update][,][insert][,][delete]
[with encryption]
as {batch | if update (col_name) [{and|or} update (col_name)] }
說明:
1 tr_name :觸發器名稱
2 on table/view :觸發器所作用的表。一個觸發器只能作用于一個表
3 for 和after :同義
4 after 與instead of :sql 2000新增項目afrer 與 instead of 的區別
After
在觸發事件發生以后才被激活,只可以建立在表上
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 操作后的數據
Deleted
存放進行delete 和update操作前的數據
注意:update 操作相當于先進行delete 再進行insert ,所以在進行update操作時,修改前的數據拷貝一條到deleted 表中,修改后
的數據在存到觸發器作用的表的同時,也同時生成一條拷貝到insered表中
您可能感興趣的文章:
  • SQL SERVER 觸發器介紹
  • 你真的了解觸發器么 數據實時同步更新問題剖析
  • Sql Server觸發器的使用
  • MySQL觸發器學習總結
  • SQLServer2005觸發器提示其他會話正在使用事務的上下文的解決方法

標簽:濟寧 貸款群呼 黃山 中衛 金昌 河源 宜春 新余

巨人網絡通訊聲明:本文標題《SQL觸發器實例講解》,本文關鍵詞  SQL,觸發器,實例,講解,SQL,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQL觸發器實例講解》相關的同類信息!
  • 本頁收集關于SQL觸發器實例講解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品久久久久久久久搜平片| 国产成a人亚洲精| 久久久午夜精品理论片中文字幕| 制服丝袜成人动漫| 久久久五月婷婷| 国产麻豆成人传媒免费观看| 欧美日韩一区二区三区四区五区| 在线看国产一区二区| 欧美一区二区黄色| 日韩一区有码在线| 91美女片黄在线观看| 国产精品嫩草久久久久| 久久99久久精品欧美| 日韩区在线观看| 久久精品免费看| 久久奇米777| 成人av电影在线播放| 亚洲精品日韩一| 91精品国产色综合久久不卡电影| 午夜激情一区二区三区| 91丨porny丨户外露出| 洋洋成人永久网站入口| 4438x亚洲最大成人网| 欧美国产日本韩| 欧美久久久久久蜜桃| 成人免费的视频| 亚洲国产精品一区二区久久恐怖片| 91视频免费观看| 麻豆成人久久精品二区三区小说| 69精品人人人人| 黄页视频在线91| 亚洲一线二线三线久久久| 福利一区二区在线| 国产精品久久久久7777按摩 | 在线观看日韩精品| 狠狠色丁香婷婷综合| 中文字幕国产精品一区二区| 欧美高清www午色夜在线视频| 99久久精品免费观看| 国产成人午夜片在线观看高清观看| 亚洲午夜视频在线| 欧美一区二区福利视频| 欧美日韩激情一区| 91看片淫黄大片一级在线观看| 亚洲成人av在线电影| 亚洲夂夂婷婷色拍ww47| 中文字幕中文字幕在线一区 | 亚洲国产精品尤物yw在线观看| 久久久99久久| 国产精品久久久久久久久久免费看| 精品久久久久久亚洲综合网| 欧美成人免费网站| 一区二区三区日韩欧美精品| 日韩电影在线免费看| 免费成人结看片| 国产成人av自拍| 国产一区二区三区久久久| 久久av资源网| 99国产精品久久久久久久久久久| 91在线视频18| 日韩欧美成人一区二区| 欧洲一区二区av| 欧美一区二区三区公司| 久久久久久久免费视频了| 国产精品色哟哟| 青青草视频一区| 在线观看免费视频综合| 久久久久久久性| 五月天激情综合| 成人高清视频在线观看| 欧美一区二区三区免费在线看 | 一区二区三区中文字幕电影| 日韩av中文字幕一区二区三区| 97se亚洲国产综合在线| 日韩欧美国产精品一区| 亚洲精品写真福利| 国产69精品久久777的优势| 国产精品欧美一区喷水| 精品少妇一区二区三区日产乱码 | 亚洲国产欧美另类丝袜| 午夜视频在线观看一区二区三区| 欧美三级三级三级| 中文字幕亚洲综合久久菠萝蜜| 一区二区免费视频| 国产91精品一区二区麻豆亚洲| 欧美日韩精品欧美日韩精品| 一区二区三区色| 色综合久久中文综合久久牛| 国产欧美视频一区二区| 国产91精品一区二区麻豆网站| 中文字幕国产精品一区二区| 成人av电影在线| 亚洲成人综合在线| 久久久久久电影| 色婷婷综合久久久久中文| 国产成人精品aa毛片| 国产精品视频观看| 国产精品私人自拍| 国产精品区一区二区三区| 欧美tickling网站挠脚心| 91美女片黄在线观看91美女| 99久久婷婷国产精品综合| 99精品视频在线免费观看| 国产69精品久久99不卡| 国产一区二区久久| 另类小说图片综合网| 亚洲精品国久久99热| 国产精品美女久久久久aⅴ国产馆| 国产精品996| 一级女性全黄久久生活片免费| 欧美日韩国产美| 午夜欧美大尺度福利影院在线看| 欧美日本一区二区在线观看| 国产精品久久久久aaaa樱花| 色噜噜久久综合| 欧美在线free| 国产精品久久午夜| 国产在线播放一区| 亚洲大型综合色站| 色国产精品一区在线观看| 久久久久久日产精品| 亚洲午夜精品网| 国产乱国产乱300精品| 99re这里只有精品视频首页| 欧美男男青年gay1069videost | 欧美一区二区视频在线观看2020 | 欧美日韩一区二区电影| 午夜电影网亚洲视频| 国产日韩一级二级三级| 91在线视频18| 福利电影一区二区三区| 91精品国产色综合久久ai换脸| 亚洲国产一区在线观看| 884aa四虎影成人精品一区| 91在线视频在线| 91香蕉视频黄| 国产偷国产偷精品高清尤物| 欧美日韩国产一二三| 91丝袜高跟美女视频| 国产一区二区不卡| 免费在线观看精品| 亚洲第一会所有码转帖| 亚洲欧美自拍偷拍| 99久久精品国产导航| 中文字幕亚洲视频| 中文字幕精品一区二区精品绿巨人| 欧美精品日韩综合在线| 99麻豆久久久国产精品免费| 成人美女视频在线观看| 美女视频一区在线观看| 麻豆成人免费电影| 国产99久久久国产精品潘金| 成人黄色av电影| 97精品国产露脸对白| 在线电影国产精品| 中日韩av电影| 日韩视频123| 欧美日本一道本| 成人av资源在线| 蜜桃视频一区二区三区| 久久激情综合网| 成人丝袜视频网| 伊人性伊人情综合网| 风间由美性色一区二区三区| 中文字幕精品一区二区精品绿巨人 | 国产揄拍国内精品对白| 一本久久a久久精品亚洲| 日韩三级高清在线| 制服.丝袜.亚洲.另类.中文| 国产91精品久久久久久久网曝门| 亚洲精品高清在线| 亚洲精品乱码久久久久久日本蜜臀| 国产精品久久影院| 奇米777欧美一区二区| 亚洲国产精品精华液2区45| 国产丝袜美腿一区二区三区| av动漫一区二区| 91老司机福利 在线| 欧美三日本三级三级在线播放| 欧美精品aⅴ在线视频| 国产精品久久综合| 国产精品色噜噜| 久久se精品一区二区| 蜜桃精品视频在线| 欧美午夜精品久久久久久超碰| 亚洲天堂2014| 粉嫩一区二区三区性色av| 久久精品网站免费观看| 理论片日本一区| 日韩欧美一级二级三级久久久| 亚洲视频一区在线| 丝袜美腿亚洲综合| 国产三区在线成人av| 图片区日韩欧美亚洲| 91亚洲精品乱码久久久久久蜜桃| 日韩视频中午一区| 精品一区二区av| 精品久久久久久久人人人人传媒 | 亚洲免费观看高清完整版在线| 国产精品一区二区在线看|