亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

SqlServer基礎之(觸發器)

2024-07-21 02:47:08
字體:
來源:轉載
供稿:網友
SqlServer基礎之(觸發器)

概念:

  觸發器(trigger)是SQLserver提供給程序員和數據分析員來保證數據完整性的一種方法,它是與表事件相關的特殊的存儲過程,它的執行不是由程序調用,也不是手工啟動,而是由事件來觸發,當對一個表進行操作(insert,delete,update)時就會激活它執行。觸發器經常用于加強數據的完整性約束和業務規則等。觸發器可以從DBA_TRIGGERS,USER_TRIGGERS數據字典中查到。

觸發器和存儲過程的區別:

  觸發器與存儲過程的區別是運行方式的不同,觸發器不能執行EXECUTE語句調用,而是在用戶執行Transact-SQL語句時自動觸發執行而存儲過程需要用戶,應用程序或者觸發器來顯示地調用并執行。

一:觸發器的優點

 1.觸發器是自動的。當對表中的數據做了任何修改之后立即被激活。

 2.觸發器可以通過數據庫中的相關表進行層疊修改。

 3.觸發器可以強制限制。這些限制比用CHECK約束所定義的更復雜。與CHECK約束不同的是,觸發器可以引用其他表中的列。

二:觸發器的作用

 觸發器的主要作用就是其能夠實現由主鍵和外鍵所不能保證的復雜參照完整性和數據的一致性,它能夠對數據庫中的相關表進行級聯修改,提高比CHECK約束更復雜的的數據完整性,并自定義錯誤消息。觸發器的主要作用主要有以下接個方面:

  1. 強制數據庫間的引用完整性
  2. 級聯修改數據庫中所有相關的表,自動觸發其它與之相關的操作
  3. 跟蹤變化,撤銷或回滾違法操作,防止非法修改數據
  4. 返回自定義的錯誤消息,約束無法返回信息,而觸發器可以
  5. 觸發器可以調用更多的存儲過程
三:觸發器的分類

 SqlServer包括三種常規類型的觸發器:DML觸發器、DDL觸發器和登錄觸發器。

1.DML(數據操作語言,DataManipulationLanguage)觸發器

 DML觸發器是一些附加在特定表或視圖上的操作代碼,當數據庫服務器中發生數據操作語言事件時執行這些操作。SqlServer中的DML觸發器有三種:

  1. insert觸發器:向表中插入數據時被觸發;
  2. delete觸發器:從表中刪除數據時被觸發;
  3. update觸發器:修改表中數據時被觸發。

當遇到下列情形時,應考慮使用DML觸發器:

  1. 通過數據庫中的相關表實現級聯更改
  2. 防止惡意或者錯誤的insert、update和delete操作,并強制執行check約束定義的限制更為復雜的其他限制。
  3. 評估數據修改前后表的狀態,并根據該差異才去措施。

2.DDL(數據定義語言,DataDefinitionLanguage)觸發器

 DDL觸發器是當服務器或者數據庫中發生數據定義語言(主要是以create,drop,alter開頭的語句)事件時被激活使用,使用DDL觸發器可以防止對數據架構進行的某些更改或記錄數據中的更改或事件操作。

3.登錄觸發器

    登錄觸發器將為響應LOGIN事件而激發存儲過程。與SQLServer實例建立用戶會話時將引發此事件。登錄觸發器將在登錄的身份驗證階段完成之后且用戶會話實際建立之前激發。因此,來自觸發器內部且通常將到達用戶的所有消息(例如錯誤消息和來自PRINT語句的消息)會傳送到SQLServer錯誤日志。如果身份驗證失敗,將不激發登錄觸發器。

四:觸發器的工作原理

觸發器觸發時:

  1. 系統自動在內存中創建deleted表或inserted表;
  2. 只讀,不允許修改,觸發器執行完成后,自動刪除。

inserted表:

  1. 臨時保存了插入或更新后的記錄行;
  2. 可以從inserted表中檢查插入的數據是否滿足業務需求;
  3. 如果不滿足,則向用戶發送報告錯誤消息,并回滾插入操作?!?/li>

deleted表:

  1. 臨時保存了刪除或更新前的記錄行;
  2. 可以從deleted表中檢查被刪除的數據是否滿足業務需求;
  3. 如果不滿足,則向用戶報告錯誤消息,并回滾插入操作。

inserted表和deleted表對照: 

修改操作記錄inserted表deleted表
增加(insert)記錄存放新增的記錄............
刪除(deleted)記錄..............存放被刪除的記錄
修改(update)記錄存放更新后的記錄存放更新前的記錄

五:創建觸發器

創建觸發器的語法:

CREATE TRIGGER trigger_name ON table_name [WITH ENCRYPTION]  FOR | AFTER | INSTEAD OF [DELETE, INSERT, UPDATE] AS   T-SQL語句GO--with encryption 表示加密觸發器定義的sql文本--delete,insert,update指定觸發器的類型

準備測試數據:

--創建學生表create table student(    stu_id int identity(1,1) primary key,    stu_name varchar(10),    stu_gender char(2),    stu_age int)

1.創建insert觸發器

--創建insert觸發器create trigger trig_inserton studentafter insertasbegin    if object_id(N'student_sum',N'U') is null--判斷student_sum表是否存在        create table student_sum(stuCount int default(0));--創建存儲學生人數的student_sum表    declare @stuNumber int;    select @stuNumber = count(*)from student;    if not exists (select * from student_sum)--判斷表中是否有記錄        insert into student_sum values(0);    update student_sum set stuCount =@stuNumber; --把更新后總的學生數插入到student_sum表中end
--測試觸發器trig_insert-->功能是向student插入數據的同時級聯插入到student_sum表中,更新stuCount--因為是后觸發器,所以先插入數據后,才觸發觸發器trig_insert;insert into student(stu_name,stu_gender,stu_age)values('呂布','男',30);select stuCount 學生總人數 from student_sum;    insert into student(stu_name,stu_gender,stu_age)values('貂蟬','女',30);            select stuCount 學生總人數 from student_sum;insert into student(stu_name,stu_gender,stu_age)values('曹阿瞞','男',40);                select stuCount 學生總人數 from student_sum;

執行上面的語句后,結果如下圖所示:

既然定義了學生總數表student_sum表是向student表中插入數據后才計算學生總數的,所以學生總數表應該禁止用戶向其中插入數據

--創建insert_forbidden,禁止用戶向student_sum表中插入數據create trigger insert_forbiddenon student_sumafter insertasbegin    RAISERROR('禁止直接向該表中插入記錄,操作被禁止',1,1)--raiserror 是用于拋出一個錯誤rollback transactionend 
--觸發觸發器insert_forbiddeninsert student_sum (stuCount) values(5);

結果如下:

2.創建delete觸發器

  用戶執行delete操作,就會激活delete觸發器,從而控制用戶能夠從數據庫中刪除數據記錄,觸發delete觸發器后,用戶刪除的記錄會被添加到deleted表中,原來表的相應記錄被刪除,所以在deleted表中查看刪除的記錄。

--創建delete觸發器create trigger trig_deleteon student after deleteasbegin    select stu_id as 已刪除的學生編號,stu_name stu_gender,stu_age    from deletedend;
--執行一一條delete語句觸發trig_delete觸發器delete from student where stu_id=1;

結果如下:

3.創建UPDATE觸發器

  update觸發器是當用戶在指定表上執行update語句時被調用被調用,這種類型的觸發器用來約束用戶對數據的修改。update觸發器可以執行兩種操作:更新前的記錄存儲在deleted表中,更新后的記錄存儲在inserted表中。

--創建update觸發器create trigger trig_updateon studentafter updateasbegin    declare @stuCount int;    select @stuCount=count(*) from student;    update student_sum set stuCount =@stuCount;    select stu_id as 更新前學生編號,stu_name as 更新前學生姓名 from deleted    select stu_id as 更新后學生編號,stu_name as 更新后學生姓名 from insertedend
--創建完成,執行一條update語句觸發trig_update觸發器update student set stu_name='張飛' where stu_id=2;

4.創建替代觸發器

  與前面介紹的三種after觸發器不同,SqlServer服務器在執行after觸發器的sql代碼后,先建立臨時的inserted表和deleted表,然后執行代碼中對數據庫操作,最后才激活觸發器中的代碼。而對于替代(instead of)觸發器,SqlServer服務器在執行觸發instead of 觸發器的代碼時,先建立臨時的inserted表和deleted表,然后直接觸發instead of觸發器,而拒絕執行用戶輸入的DML操作語句。

--創建instead of 觸發器 create trigger trig_insteadOfon student instead of insertas begin    declare @stuAge int;    select @stuAge=(select stu_age from inserted)if(@stuAge >120)    select '插入年齡錯誤' as '失敗原因'end

創建完成,執行一條insert語句觸發觸發器trig_insteadOf

5.嵌套觸發器介紹

 如果一個觸發器在執行操作時調用了另外一個觸發器,而這個觸發器又接著調用了下一個觸發器,那么就形成了嵌套觸發器。嵌套觸發器在安裝時就被啟用,但是可以使用系統存儲過程sp_configure禁用和重新啟用嵌套觸發器。

  嵌套觸發器不一定要形成一個環,它可以T1->T2->T3...這樣一直觸發下去,最多允許嵌套32層。如果嵌套的次數超過限制,那么該觸發器將被終止,并回滾整個事務,使用嵌套觸發器需要注意以下幾點:

  • 默認情況下,嵌套觸發器配置選項是開啟的。
  • 在同一個觸發器事務中,一個嵌套觸發器不能被觸發兩次。
  • 由于觸發器是一個事務,如果在一系列嵌套觸發器的任意層次中發生錯誤,則整個事物都將取消,而且所有數據回滾。

嵌套是用來保持整個數據庫的完整性的重要功能,但有時可能需要禁用嵌套,如果禁用了嵌套,那么修改一個觸發器的實現不會再觸發該表上的任何觸發器。在下述情況下,需要禁用嵌套觸發器:

  • 嵌套觸發要求復雜而有理論的設計,級聯修改可能會修改用戶不想涉及的數據。
  • 在一系列嵌套觸發器中的任意點的時間修改操作都會觸發一些觸發器,盡管這時數據庫提供很強的保護功能,但如果以特定的順序更新表,就會產生問題。

使用下列語句禁用嵌套和再次啟用嵌套:

--禁用嵌套exce sp_configure 'nested triggers',0;--啟用嵌套exce sp_configure 'nested triggers',1;

6.遞歸觸發器

  觸發器的遞歸是指一個觸發器從其內部再一次激活該觸發器,例如update操作激活的觸發器內部還有一條數據表的更新語句,那么這個更新語句就有可能激活這個觸發器本身,當然,這種遞歸的觸發器內部還會有判斷語句,只有一定情況下才會執行那個T_SQL語句,否則就成為無線調用的死循環了。

SqlServer中的遞歸觸發器包括兩種:直接遞歸和間接遞歸。

  • 直接遞歸:觸發器被觸發后并執行一個操作,而該操作又使用一個觸發器再次被觸發。
  • 間接遞歸:觸發器被觸發并執行一個操作,而該操作又使另一個表中的某個觸發器被觸發,第二個觸發器使原始表得到更新,從而再次觸發第一個觸發器。

默認情況下,遞歸觸發器選項是禁用的。遞歸觸發器最多只能遞歸16層,如果遞歸中的第16個觸發器激活了第17個觸發器,則結果與發布的rol

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕免费精品一区| 亚洲女人天堂视频| 亚洲无线码在线一区观看| 日韩人体视频一二区| 欧美在线视频导航| 日本aⅴ大伊香蕉精品视频| 欧美性生交xxxxxdddd| 国产精品一区二区三| 国产精品久久久久久久久久东京| 国产美女久久精品香蕉69| 亚洲欧美制服中文字幕| 久久久天堂国产精品女人| 久久人人看视频| 亚洲欧美国产精品专区久久| 久久精品国产亚洲| 国产精品欧美久久久| 日韩视频中文字幕| 久久久999国产精品| 91国产精品视频在线| 久久九九精品99国产精品| 久久国产精品久久国产精品| 国内精品视频在线| 日本一区二区三区四区视频| 久久精品夜夜夜夜夜久久| 欧美一级淫片videoshd| 国产精品黄色影片导航在线观看| 日本亚洲欧美成人| 欧美性色视频在线| 国产成+人+综合+亚洲欧洲| 久久人人爽人人爽人人片av高清| 精品在线小视频| 人人做人人澡人人爽欧美| 亚洲性无码av在线| 国产精品久久久久久久久久久不卡| 久久99久久久久久久噜噜| 精品国产一区二区三区久久久狼| 亚洲精品91美女久久久久久久| 中文字幕久热精品视频在线| 精品香蕉在线观看视频一| 国产精品爽爽爽| 国产视频欧美视频| yellow中文字幕久久| 成人午夜激情网| 欧美激情亚洲另类| 亚洲自拍中文字幕| 中文字幕无线精品亚洲乱码一区| 日韩av在线电影网| www.欧美精品一二三区| www.欧美精品一二三区| 亚洲精品福利在线| 92福利视频午夜1000合集在线观看| 91网站免费观看| 国产91精品久久久久久| 国产精品女人网站| 日本中文字幕久久看| 亚洲欧美国内爽妇网| 91精品中文在线| 国产精品欧美久久久| 国产精品色悠悠| 国产亚洲人成网站在线观看| 欧美日韩美女视频| 中国人与牲禽动交精品| 亚洲欧美中文在线视频| 久久久国产影院| 亚洲人成网7777777国产| 国产亚洲人成a一在线v站| 精品国产区一区二区三区在线观看| 亚洲午夜国产成人av电影男同| 精品国产区一区二区三区在线观看| 九九视频直播综合网| 中文字幕亚洲欧美| 成人精品一区二区三区电影黑人| 亚洲国产精品大全| 欧美视频免费在线| www.色综合| 亚洲国产欧美一区二区三区同亚洲| 成人免费观看49www在线观看| 精品香蕉在线观看视频一| 国产有码一区二区| 午夜精品国产精品大乳美女| 国产精品av网站| 国产成人免费91av在线| 亚洲天堂男人天堂| 久久久国产精品视频| 国产精品黄页免费高清在线观看| 97在线精品国自产拍中文| 日韩亚洲欧美成人| 在线观看免费高清视频97| 欧美国产在线视频| 久久综合伊人77777尤物| 欧美激情中文网| 亚洲日本中文字幕免费在线不卡| 九九久久久久久久久激情| 中文字幕亚洲一区二区三区五十路| 中文字幕久久久av一区| 国产精品久久国产精品99gif| 精品国产一区二区三区在线观看| 国产成人涩涩涩视频在线观看| 国产精品久久久久久久久久免费| 亚洲日本aⅴ片在线观看香蕉| 欧美视频在线看| 韩国欧美亚洲国产| 久久99国产精品自在自在app| 欧美最猛黑人xxxx黑人猛叫黄| 日韩欧美成人免费视频| 亚洲国产成人91精品| 97国产精品人人爽人人做| 国内精品久久影院| 日本一区二区不卡| 久久久久久综合网天天| 欧美一级淫片videoshd| 在线亚洲国产精品网| 日韩av在线网| 亚洲国产精品嫩草影院久久| 97av在线视频免费播放| 欧美做爰性生交视频| 欧美精品video| 亚洲国产成人在线播放| 亚洲石原莉奈一区二区在线观看| 91精品国产成人| 91中文字幕在线| 超碰日本道色综合久久综合| 成人国产精品色哟哟| 欧美日韩免费观看中文| 国产精品福利网| 国产精品大片wwwwww| 国产精品对白刺激| 日韩小视频在线| 粉嫩老牛aⅴ一区二区三区| 亚洲国产美女精品久久久久∴| 一本一本久久a久久精品牛牛影视| 国产精品人人做人人爽| 国产成人欧美在线观看| 国产精品都在这里| 精品美女久久久久久免费| 成人黄色激情网| 奇米4444一区二区三区| 国产精品自拍小视频| 亚洲第一精品久久忘忧草社区| 欧美尺度大的性做爰视频| 成人免费高清完整版在线观看| 国产激情久久久久| 亚洲精品资源美女情侣酒店| 亚洲欧美日韩综合| 精品日韩美女的视频高清| 久久不射热爱视频精品| 91精品国产777在线观看| 国产色综合天天综合网| 国产精品91久久久| 亚洲xxxx视频| 欧美成人精品激情在线观看| 国产一区二区三区丝袜| 欧美午夜片在线免费观看| 亚洲一二三在线| 亚洲激情第一页| 成人精品视频在线| 国产97在线观看| 在线观看中文字幕亚洲| 欧美激情奇米色| 亚洲自拍高清视频网站| 欧美一二三视频| 国产在线高清精品| 亚洲人成在线观| 国产精品jizz在线观看麻豆|