1. 程式人生 > >SQL SERVER觸發器應用案例講解(deleted表或者inserted表)

SQL SERVER觸發器應用案例講解(deleted表或者inserted表)

1、觸發器觸發時:
   a、系統自動在記憶體中建立deleted表或者inserted表
  b、只讀,不允許修改;觸發器執行完成後,自動刪除
2、inserted表
a、臨時儲存了插入或更新後的記錄行
b、可以從inserted表中檢查插入的資料是否滿足業務需求
c、如果不滿足,則向用戶報告訊息錯誤,並回滾插入操作
3、deleted表
a、臨時儲存了刪除或更新前的記錄行
b、可以存deleted表中檢查刪除的資料是否滿足業務
c、如果不滿足,則向用戶報告錯誤訊息,並回滾插入操作
4、關於inserted與deleted表的說明

SQL <wbr>SERVER觸發器應用案例講解(deleted表或者inserted表)

建立觸發器的語法:
Create trigger trigger_name
on {table_name|view}
[with encryption]
{
{{FOR|AFTER|INSTEAD OF}{ [delete,insert,update] [ , ] [UPDATE]}
[WITH APPEND]
[NOT FOR REPLICATION]
AS
[  { IF UPDATE (column)  [{AND | OR} UPDATE (column)] |
IF (COLUMNS_UPDATED ())}]
t-sql語句
go
}
Table_name|view
是在其上執行觸發器的表或檢視,有時稱觸發器表或觸發器檢視。可以選擇是否指定表或檢視所有者的名稱
with encryption表示加密觸發器定義的sql文字
加密syscomments 表中包含Create trigger語句文字的條目,使用With Encryption可以防止將觸發器作為SQL SERVER複製的一部分發布
AFTER
指定觸發器只有在觸發SQL語句中指定的所有操作都已成功後才激發,所有的應用級聯操作和約束檢查也必須完成後,才能執行次觸發器。
如果僅指定FOR關鍵子,則AFTER是預設值。
不能再檢視上定義AFTER觸發器
INSTEAD OF
指定執行觸發器而不是執行觸發SQL語句,從而替代觸發語句的操作
在表或檢視上,每個INSERT、UPDATE或DELETE語句最多定義一個INSERT OF 觸發器,然而可以在每個具有INSTEAD OF觸發器的檢視上定義檢視。
INSERT OF觸發器不能再WITH CHECK OPTION的可更新檢視上定義,如果指向了WITH CHECK OPTION 選項的可更新檢視新增INSERT OF觸發器,SQL SERVER將產生一個錯誤,使用者必須用Alter View刪除該選項後才能定義INSTEAD OF 觸發器.
{[delete] [,] [insert] [,] [update]}
是指定在表或檢視上執行那些資料修改語句時將啟用觸發器的關鍵子,必須至少指定一個選項,在觸發器定義中允許使用一任意順序組合的這些關鍵字,如果指定的選項多於一個,需要逗號分隔這些選項。
對於INSERT OF觸發器,不允許在具有ON DELETE級聯操作引用關係的表上使用DELETE選項,同樣,也不允許在具有ON UPDATE級聯操作引用關係的表上使用UPDATE選項。
delete,insert,update指定觸發器的型別
示例1、insert觸發器
insert觸發器的工作原理
 SQL <wbr>SERVER觸發器應用案例講解(deleted表或者inserted表)

問題:解決上述的銀行取款問題,單向交易資訊表(transinfo)中插入一條交易資訊時,我們應自動更新對應賬號的餘額。
分析:
在交易表上建立insert觸發器
從inserted臨時表中獲取插入的資料行
根據交易型別(Transtype)自動的值是存入/支取
增加/減少對應賬號的餘額
 
create trigger trig_transinfo
on transinfo
for insert
as
declare @type varchar(4),@outmoney money
declare @mycardid varchar(10), @balance money
select @type=transtype,@outmoney=transmoney,@mycardid=cardid from inserted
if(@type='支取')//根據交易型別,增加與減少卡號的餘額
update bank set 

[email protected] where [email protected]
else
update bank set [email protected] where [email protected]
示例2、
create trigger trig_transInfo
on TTotal
for insert
as
declare @year varchar(100)
select @year=年份 from inserted
if(@year='2007')
rollback transaction
2、delete觸發器
delete觸發器的工作原理:
 SQL <wbr>SERVER觸發器應用案例講解(deleted表或者inserted表)

問題:單刪除交易資訊表時,要求自動備份被刪除的資料到表的backuptable中
分析:
在交易資訊表上建立delete觸發器
被刪除的資料可以從deleted表中獲取
create trigger trig_delete_info
on transinfo
for delete
as
print '開始備份資料,請稍後.....'
if not exists(select * from sysobjects where name='bakcuptable')
select * into backuptable from deleted
else
insert into backuptable select * from deleted
print '備份資料成功,備份表中的資料為:'
select * from backuptable
go
 
案例2,員工退休將員工資訊存員工表刪除,然後存入退休人員表
create trigger trig_delete_transinfo
on Employees
for delete
as
print '開始備份資料,請稍後...'
if not exists(select * from sysobjects where name='backuptable')
select * into backuptable from deleted
else
insert into backuptable select UserName,SSex from deleted
print '備份資料成功,備份表中的資料為'
select * from backuptable
go
3、update觸發器,
update觸發器的工作原理:
 SQL <wbr>SERVER觸發器應用案例講解(deleted表或者inserted表)

問題跟蹤使用者的交易,交易額超過20000元,則取消交易,並給出錯誤提示
分析:
在bank表中建立update觸發器
修改前的資料可以從deleted表中獲取
修改後的資料可以從inserted表中獲取
create trigger trig_update_bank
on bank
for update
as
declare @beforemoney money,@aftermoney money
select @beforemoney=currentmoney from deleted
select @aftermoney=currentmoney from inserted
if abs(@[email protected])>2000
begin
print '交易金額:'+convert(varchar(100),abs(@[email protected]))
raiserror('每筆交易不能超過2萬元,交易失敗',16,1)
rollback transaction
end
go
執行:
update bank set currentmoney=currentmoney+200001 where ID=1
 
列級Update觸發器
update 觸發器除了跟蹤資料的變化(修改)外,還可以檢查是否修改了某列的資料
使用update(列)函式檢測是否修改了某列
問題:
交易日期一般有系統自動產生,預設為當前日期,為了安全起見,一般禁止修改,以防舞弊
分析:
update(列名)函式可以檢測是否修改了某列
create trigger trig_update _transinfo
on transInfo
for update
as
if update(transdate)
begin
print '交易失敗......'
RAISERROR('安全警告,交易日期不能修改,有系統自動產生',16,1)
rollback transaction
end
go
4、instead of觸發器
create trigger trig_ttotal
on sc
instead of insert
as
begin
insert into TT Values('2007','鄭州','zb3',12,3)
end
當在sc表中插入一條記錄時,不執行在sc表中插入記錄,執行你指定的操作
insert into sc(courseid,studentid,grade) values(1,12,90),
 instead of 觸發器的用法
INSTEAD OF 觸發器的主要優點是可以使不能更新的檢視支援更新。基於多個基表的檢視必須使用   
       INSTEAD OF 觸發器來支援引用多個表中資料的插入、更新和刪除操作。INSTEAD OF 觸發器的另一個優點是使您得以編寫這樣的邏輯程式碼:在允許批處理的其他部分成功的同時拒絕批處理中的某些部分。

       Transact-SQL 語句建立兩個基表、一個檢視和檢視上的 INSTEAD OF 觸發器。以下表將個人資料和業務資料分開並且是檢視的基表。


--部門表
create table dept
(
    d_id int primary key,
    d_name varchar(20)
)
--員工表
create table emp
(
   e_id int primary key,
   e_name varchar(20),
   d_id int references dept(d_id)
)
select * from emp
 
drop view v
create view v
as
select e_id,e_name,d.d_id,d_name from emp e,dept d where e.d_id=d.d_id
 
select * from v
 
 
insert into v values(1001,'張珊',101,'銷售部')
 

drop trigger de_em_insert
go
create trigger de_em_insert
on v
instead of insert
as
begin
    if (not exists (select d.d_id from dept d, inserted i where d.d_id = i.d_id))
     insert into dept select d_id,d_name from inserted
 
   if (not exists (select e.d_id from emp e, inserted i where e.d_id = i.d_id))
   insert into emp select e_id,e_name,d_id from inserted
else
   update emp set e_id = i.e_id,e_name = i.e_name from emp e, inserted i where e.d_id = i.d_id
end
 

       可以在檢視或表中定義 INSTEAD OF DELETE 觸發器,以代替 DELETE 語句的標準操作。通常,在檢視上定義 INSTEAD OF DELETE 觸發器以便在一個或多個基表中修改資料。  

       可在檢視上定義 INSTEAD OF UPDATE 觸發器以代替 UPDATE 語句的標準操作。通常,在檢視上定義 INSTEAD OF UPDATE 觸發器以便修改一個或多個基表中的資料。
 
觸發器是在對錶進行插入、更新或刪除操作時自動執行的儲存過程,觸發器通暢用於強制業務規則
觸發器是一個特殊的事務單位,當出現錯誤是,可以執行rollback transaction回滾撤銷操作
觸發器一般都需要使用臨時表,deleted和inserted表,他們存放被刪除或插入記錄的副本
觸發器型別:insert觸發器、update觸發器、delete觸發器

相關推薦

SQL SERVER觸發器應用案例講解deleted或者inserted

1、觸發器觸發時:    a、系統自動在記憶體中建立deleted表或者inserted表   b、只讀,不允許修改;觸發器執行完成後,自動刪除 2、inserted表 a、臨時儲存了插入或更新後的記錄行 b、可以從inserted表中檢查插入的資料是否滿足業務需求 c、

SQL Server效能優化案例分享1——CPU持續過高——CPU高使用率的常見原因及處理方向

本系列屬於 SQL Server效能優化案例分享 專題     部分內容借用《SQL Server 2012實施與管理實戰指南》P592,如果SQL Server錯誤日誌裡面並沒有17883/17884這類錯誤,但是SQ

SQL Server 批量刪除重複記錄批量、快速、安全

關鍵字:ROW_NUMBER(或RANK)  partition BY 利用分組排序,可實現快速、安全、批量的對重複記錄進行刪除, 示例: 建立測試表 CREATE TABLE [dbo].[T_C

SQL server觸發器例項講解如何實現兩個的關聯

SQL觸發器例項1 定義: 何為觸發器?在SQL Server裡面也就是對某一個表的一定的操作,觸發某種條件,從而執行的一段程式。觸發器是一個特殊的儲存過程。 常見的觸發器有三種:分別應用於Insert , Update , Delete 事件。 我為什麼要使用觸發器?比如,這麼兩個表: Create

SQL SERVER 觸發器 inserteddeleted

在觸發器語句中用兩個特殊的表一個是deleted表和inserted。它們是通過觸發器操作自動建立駐留在記憶體中的臨時表。 Deleted表用於儲存 DELETE和 UPDATE語句所影響的行的複本。在執行DELETE或 UPDATE語句時,行從觸發器表中刪除,並傳輸到

SQL SERVER觸發器附有例項

觸發器:即當發生某一事件時,如果滿足給定條件,則執行相應的動作。它的基本架構:  觸發器建立語法:(1)CREATETRIGGER trigger_nameON table|viewFOR|AFTER|

Flume抽取SQL Server設計方案具體實現觸發器

上一篇將瞭如何使用Flume收集SQL server Board中的新增資料進行處理,如下針對更新的資料進行分析需求:對Board表更新的資料進行處理1.建立一個存更新資料的表Tri_Board_Update,表結構基本和原表機構一樣,但需要新增Update_id(唯一標識列

sqlserver 下載地址SQL Server 2008 R2 中英文 開發版/企業版/標準版 下載

span 標準 bd09 pub add sina 4.0 published div 轉自:http://blog.sina.com.cn/s/blog_624b1f950100pioh.html 註:企業版無法安裝在xp和win7,開發版才可以! 一. 簡體

SQL SERVER大話存儲結構3_數據行的行結構

bits 基礎 就會 mar ant rain 版權 bpa 一個數 一行數據是如何來存儲的呢? 變長列與定長列,NULL與NOT NULL,實際是如何整理存放到 8k的數據頁上呢? 對表格進行增減列,修改長度,添加默認值等DDL S

三種數據庫日期轉字符串對照sql server、oracle、mysqlV4.11

to_date 擴展 article zha ret lar span timestamp tracking 三種數據庫日期轉換對照: http://blog.csdn.net/zljjava/article/details/17552741 SQL類

SQL server觸發器、存儲過程操作遠程數據庫插入數據,解決服務器已存在的問題

定義 ims val rom 記錄 插入記錄 其它 pre 項目 近期弄了一個小項目,也不是非常復雜,須要將一個數據庫的一些數據備份到另外一個庫。不是本地,可能是網絡上其它的數據庫。想了一下,用了存儲過程和觸發器。也不是非常復雜,首先我須要操作遠程數據庫,於是寫了一個存

SQL Server 2012 無人值守安裝加入新實例

let disable agen ctu 獲取 miss ont logs windows 方法1,通過指定條個參數安裝 setup.exe /Q /IACCEPTSQLSERVERLICENSETERMS /ACTION=install /PID=<

08.SQL Server 基本操作【分離脫機、附加聯機

原因 -1 文件的操作 刪除 方法 附加 文件 技術分享 屬性 1、創建、刪除(對準數據庫右鍵)2、分離(脫機)、附加(聯機) 關於附加數據庫失敗的處理:原因:對文件的操作權限不夠處理方法:對準mdf文件和ldf文件 右鍵 屬性 安全性將 用戶 Users

SQL SERVER DATETIME應用

print flow and .com bold class lin eight spa PRINT ‘上周的第一天:‘+CONVERT(NVARCHAR(20),DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE())-1, 0),120);

SQL SERVER循環遍歷普通循環和遊標循環

into 變量 alloc lar -1 記錄 gin pda 普通 1、首先需要一個測試表數據Student 2、普通循環 1)循環5次來修改學生表信息 --循環遍歷修改記錄--declare @i int set @i=0while @i<5b

如何解決SQL Server 2008 無法連接到local

選擇 ima self 服務器類型 clear erl 引擎 gem sign 打開SQL SERVER配置管理--》SQL SERVER 網絡配置--》實例名的協議 將SQLEXPRESS協議中的Named Pipes和 TCP/IP啟用。

【2018-01-19】Sql Server-觸發器

1-1 觸發器 eight sco 不能 val ted 直接 ins 1 --create table users--創建用戶表 2 --( 3 -- ids int primary key identity(1,1), 4 -- name nvar

SQL Server 自定義函數Function——參數默認值

指定 SQ binding img 種類 return png begin TP 原文:SQL Server 自定義函數(Function)——參數默認值sql server 自定義函數分為三種類型:標量函數(Scalar Function)、內嵌表值函數(Inline F

Formik官方應用案例解析Basics

asi 思路 box 用法 結構 核心 分析 tps 下載地址 說明 下載地址:https://codesandbox.io/s/zKrK5YLDZ 本案例介紹Formik基本用法,我想在前面幾篇的基礎上著重分析一下其核心API及數據結構的使用思路。 (to be co

Formik官方應用案例解析同步校驗

ssa tools require min roc 是否 支持 array tps 簡介 官方示例工程formik-09x-synchronous-validation-example展示的是基於Formik的表單開發中如何進行定制的同步校驗的問題。 上一個實例相關內容回顧