最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQL?SERVER觸發(fā)器詳解

 更新時(shí)間:2022年02月24日 14:21:15   作者:.NET開發(fā)菜鳥  
本文詳細(xì)講解了SQL?SERVER中觸發(fā)器的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

觸發(fā)器是一種特殊的存儲(chǔ)過程,觸發(fā)器主要是通過事件進(jìn)行觸發(fā)而被自動(dòng)調(diào)用執(zhí)行,而存儲(chǔ)過程必須通過存儲(chǔ)過程的名稱被調(diào)用。

一、觸發(fā)器的定義

觸發(fā)器是在對表進(jìn)行插入、更新或刪除操作時(shí)自動(dòng)執(zhí)行的特殊存儲(chǔ)過程。觸發(fā)器通常用于強(qiáng)制業(yè)務(wù)規(guī)則,觸發(fā)器是一種高級約束,可以定義比CHECK約束更為復(fù)雜的約束:可以執(zhí)行復(fù)雜的SQL語句(if/while/case),可以引用其他表中的列。觸發(fā)器定義在特定的表上,與表相關(guān),自動(dòng)觸發(fā)執(zhí)行,不能直接調(diào)用,是一個(gè)事務(wù)(可回滾)。

二、觸發(fā)器分類

SQL SERVER中觸發(fā)器可以分為兩類:DML觸發(fā)器和DDL觸發(fā)器,DML觸發(fā)器針對表,DDL觸發(fā)器會(huì)影響多種數(shù)據(jù)定義語言語句而觸發(fā),這些語句有create、alter、drop語句。

DML觸發(fā)器分為:

1、after觸發(fā)器(之后觸發(fā))

  • a、insert觸發(fā)器
  • b、update觸發(fā)器
  • c、delete觸發(fā)器

2、instead of觸發(fā)器(之前觸發(fā))

after觸發(fā)器要求只有執(zhí)行某一操作(insert、update、delete)之后觸發(fā)器才能被觸發(fā),且只能定義在表上。而instead of觸發(fā)器表示并不執(zhí)行其定義的操作(insert、update、delete)而僅是執(zhí)行觸發(fā)器本身,其優(yōu)先級高于觸發(fā)語句的執(zhí)行。

觸發(fā)器有兩個(gè)特殊的表:插入表(instered表)和刪除表(deleted表)

這兩張表是邏輯表也是虛表,觸發(fā)器觸發(fā)時(shí)系統(tǒng)自動(dòng)在內(nèi)存中創(chuàng)建這兩張表,不會(huì)存儲(chǔ)在數(shù)據(jù)庫中。這兩張表都是只讀的,不允許修改。這兩張表的結(jié)果總是與被觸發(fā)器應(yīng)用的表的結(jié)構(gòu)相同。當(dāng)觸發(fā)器完成工作后,這兩張表就會(huì)被刪除。inserted表臨時(shí)保存了插入或更新后的記錄行,可以從inserted表中檢查插入的數(shù)據(jù)是否滿足業(yè)務(wù)需求,如果不滿足,則向用戶報(bào)告錯(cuò)誤消息,并回滾插入操作。deleted表臨時(shí)保存了刪除或更新前的記錄行,可以從deleted表中檢查被刪除的數(shù)據(jù)是否滿足業(yè)務(wù)需求,如果不滿足,則向用戶報(bào)告錯(cuò)誤消息,并回滾刪除操作。update數(shù)據(jù)的時(shí)候是先刪除表記錄,然后插入一條記錄,在inserted和deleted表就都有update后的數(shù)據(jù)記錄了。

  inserted表和deleted表存放的信息:

修改操作

inserted表

deleted表

增加(INSERT)記錄

存放新增的記錄

刪除(DELETE)記錄

存放被刪除的記錄

修改(UPDATE)記錄

存放更新后的記錄

存放更新前的記錄

三、創(chuàng)建觸發(fā)器

語法:

     CREATE TRIGGER trigger_name

     ON table_name

     [WITH ENCRYPTION]

     FOR [DELETE, INSERT, UPDATE]

     AS

       T-SQL語句

     GO

WITH ENCRYPTION表示加密觸發(fā)器定義的SQL文本

DELETE, INSERT, UPDATE指定觸發(fā)器的類型

1、創(chuàng)建insert類型的觸發(fā)器

插入觸發(fā)器

--GradeInfo表中插入一條數(shù)據(jù),MyStudentInfo表中插入一條記錄
IF (object_id('tr_insert','tr') is not null)
    drop trigger tr_insert
GO
CREATE trigger tr_insert
on GradeInfo
after insert --插入觸發(fā)
as
 begin
   --定義變量
   declare @GradeId int
   --在inserted表中查詢已經(jīng)插入記錄信息
   select @GradeId=id from INSERTED
   --MyStudentInfo表中插入數(shù)據(jù)
   insert INTO MyStudentInfo (GradeId) VALUES (@GradeId)
   print '插入成功!'
 end

插入數(shù)據(jù)

insert INTO GradeInfo VALUES (11,'C++')

查詢數(shù)據(jù)

select * from MyStudentInfo where GradeId=11

2、delete觸發(fā)器

刪除MyStudentInfo表中的數(shù)據(jù),插入備份表

--刪除MyStudentInfo表中的數(shù)據(jù),插入備份表
 IF (object_id('tr_Delete','tr') is not null)
    drop TRIGGER tr_Delete
 GO
 CREATE trigger tr_Delete
 on MyStudentInfo
 for delete
 as
  begin
    print '正在備份數(shù)據(jù)......'
 IF (object_id('MyStudentInfo_Back','U') is not null)
 --存在表,直接插入數(shù)據(jù)
   insert INTO MyStudentInfo_Back SELECT * from DELETED
 else
   select * into MyStudentInfo_Back from DELETED
 PRINT '備份完成'
  end

刪除前查詢MyStudentInfo表數(shù)據(jù)

select * from MyStudentInfo

刪除id=9的數(shù)據(jù)

delete FROM MyStudentInfo where Id=9

查詢備份表數(shù)據(jù)

select * from MyStudentInfo_Back

3、update觸發(fā)器

  IF (object_id('tr_Update','tr') is not null)
     drop TRIGGER tr_Update
  GO
  CREATE trigger tr_Update
  on MyStudentInfo
  for update
  as
    begin
   --聲明變量,存儲(chǔ)更新前和更新后的姓名
   declare @OldName varchar(16),@NewName varchar(16)
   select @OldName=name from DELETED
   print '更新前姓名:'+@OldName
   select @NewName=name from INSERTED
   print '更新后姓名:'+@NewName
 end

把張三更新為"張三測試"

update MyStudentInfo SET Name='張三測試' where Id=1

update更新列級觸發(fā)器

 --update更新列級觸發(fā)器
   IF (object_id('tr_update_column','tr') is not null)
      drop TRIGGER tr_update_column
   GO
   CREATE trigger tr_update_column
   on GradeInfo
   for update
   as
     begin
    IF(update(id))
      begin
     print '系統(tǒng)提示:主鍵ID不能更新'
     rollback
   end
  end

更新id列

update GradeInfo SET Id=15 where Id=4

4、instead of觸發(fā)器

instead of觸發(fā)器表示并不執(zhí)行其定義的操作(insert、update、delete)而僅是執(zhí)行觸發(fā)器本身的內(nèi)容,其優(yōu)先級高于定義的SQL語句的執(zhí)行

語法:

create trigger tgr_name
on table_name
with encryption
    instead of update...
as
    begin
  T-SQL
 end

創(chuàng)建instead of觸發(fā)器

--創(chuàng)建instead of觸發(fā)器
/*MyStudentInfo表里面插入數(shù)據(jù)之前,先判斷GradeInfo表中是否有對應(yīng)的班級ID,如果沒有,不允許插入,如果存在,則插入 */
IF (object_id('tr_insteadOf','tr') is not null)
   drop TRIGGER tr_insteadOf
GO
CREATE trigger tr_insteadOf
on MyStudentInfo
instead of insert
as
  begin
     IF exists(SELECT * FROM GradeInfo WHERE Id=(SELECT GradeId FROM INSERTED))
      print '該班級存在,可以插入'
  else
    begin
      print '該班級不存在,不可以插入'
   rollback
    end
  end

測試1,插入不存在的班級id

insert INTO MyStudentInfo (GradeId) VALUES (15)

測試2,插入存在的班級id

insert INTO MyStudentInfo (GradeId) VALUES (5)

DDL觸發(fā)器

? create trigger tr_DDL on database
? for DROP_TABLE,ALTER_TABLE
? as
??? begin
????? print '別想著刪庫!好好打你的代碼'
?? rollback --回滾
?end

測試刪除表

drop TABLE MyStudentInfo

測試修改表結(jié)構(gòu)

alter table MyStudentInfo
alter column Name varchar(32)

禁用DML觸發(fā)器

disable trigger tr_insteadOf on MyStudentInfo

啟用DML觸發(fā)器

enable trigger tr_insteadOf on MyStudentInfo

禁用DDL觸發(fā)器

disable trigger tr_DDL on database

啟用DDL觸發(fā)器

enable trigger tr_DDL on database

到此這篇關(guān)于SQL SERVER觸發(fā)器詳解的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • dbeaver配置SQL?server連接實(shí)現(xiàn)

    dbeaver配置SQL?server連接實(shí)現(xiàn)

    本文主要介紹了dbeaver配置SQL?server連接實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 很有意思的SQL多行數(shù)據(jù)拼接

    很有意思的SQL多行數(shù)據(jù)拼接

    今天為了實(shí)現(xiàn)一個(gè)很原始的問題上網(wǎng)查資料,見到一個(gè)很有意思的SQL語句,和大家分享一下
    2011-10-10
  • SQL Server 觸發(fā)器實(shí)例詳解

    SQL Server 觸發(fā)器實(shí)例詳解

    觸發(fā)器是一種特殊類型的存儲(chǔ)過程,它不同于之前的我們介紹的存儲(chǔ)過程。觸發(fā)器主要是通過事件進(jìn)行觸發(fā)被自動(dòng)調(diào)用執(zhí)行的,接下來本文通過實(shí)例詳解sqlserver觸發(fā)器,對sqlserver觸發(fā)器相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • win2003上安裝SQL2000時(shí)CD-KEY(序列號(hào))無法驗(yàn)證解決方法

    win2003上安裝SQL2000時(shí)CD-KEY(序列號(hào))無法驗(yàn)證解決方法

    win2003上安裝SQL2000時(shí)CD-KEY(序列號(hào))無法驗(yàn)證解決方法,一般都是使用第二種方法。
    2011-08-08
  • Sql注入原理簡介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Sql注入原理簡介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    所謂SQL注入,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令。下面通過本文給大家分享sql 注入原理解析,感興趣的朋友一起看看吧
    2017-08-08
  • sql中的 where 、group by 和 having 用法解析

    sql中的 where 、group by 和 having 用法解析

    這篇文章主要介紹了sql中的 where 、group by 和 having 用法解析,需要的朋友可以參考下
    2017-04-04
  • sql server字符串非空判斷實(shí)現(xiàn)方法

    sql server字符串非空判斷實(shí)現(xiàn)方法

    在使用sql server過程中會(huì)遇到非空判斷,本文將詳細(xì)介紹sql server字符串非空判斷實(shí)現(xiàn)方法,需要了解的朋友可以參考下
    2012-12-12
  • SQL SERVER 觸發(fā)器介紹

    SQL SERVER 觸發(fā)器介紹

    觸發(fā)器是一種特殊類型的存儲(chǔ)過程,它不同于之前的我們介紹的存儲(chǔ)過程。觸發(fā)器主要是通過事件進(jìn)行觸發(fā)被自動(dòng)調(diào)用執(zhí)行的。而存儲(chǔ)過程可以通過存儲(chǔ)過程的名稱被調(diào)用。
    2013-03-03
  • 教你輕松學(xué)會(huì)SQL Server記錄輪班的技巧

    教你輕松學(xué)會(huì)SQL Server記錄輪班的技巧

    員工使用電子時(shí)鐘進(jìn)行簽名,這種電子簽名可以自動(dòng)將記錄添加到SQL Server數(shù)據(jù)庫中。但是,有時(shí)候,需要增加一個(gè)夜班;即使這個(gè)輪班發(fā)生在第二天,它仍然會(huì)被認(rèn)為是第三班
    2013-11-11
  • SqlServer生成連續(xù)數(shù)字根據(jù)指定的數(shù)字操作

    SqlServer生成連續(xù)數(shù)字根據(jù)指定的數(shù)字操作

    這篇文章主要介紹了SqlServer生成連續(xù)數(shù)字根據(jù)指定的數(shù)字操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10

最新評論

邢台县| 都兰县| 伊宁市| 锡林郭勒盟| 丘北县| 合阳县| 龙川县| 河曲县| 大理市| 克东县| 依安县| 五河县| 景东| 邓州市| 神池县| 神农架林区| 乌鲁木齐市| 布尔津县| 工布江达县| 密云县| 共和县| 屏东县| 米易县| 武川县| 山东省| 阳原县| 将乐县| 满城县| 花莲市| 保德县| 汝州市| 丰宁| 铅山县| 延川县| 普洱| 宁阳县| 青铜峡市| 武乡县| 宝清县| 吉林省| 霍城县|