一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - SQL SERVER觸發器詳解

SQL SERVER觸發器詳解

2022-02-24 21:57.NET開發菜鳥 Sql Server

本文詳細講解了SQL SERVER中觸發器的用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

觸發器是一種特殊的存儲過程,觸發器主要是通過事件進行觸發而被自動調用執行,而存儲過程必須通過存儲過程的名稱被調用。

 

一、觸發器的定義

觸發器是在對表進行插入、更新或刪除操作時自動執行的特殊存儲過程。觸發器通常用于強制業務規則,觸發器是一種高級約束,可以定義比CHECK約束更為復雜的約束:可以執行復雜的SQL語句(if/while/case),可以引用其他表中的列。觸發器定義在特定的表上,與表相關,自動觸發執行,不能直接調用,是一個事務(可回滾)。

 

二、觸發器分類

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

DML觸發器分為:

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

  • a、insert觸發器
  • b、update觸發器
  • c、delete觸發器

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

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

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

這兩張表是邏輯表也是虛表,觸發器觸發時系統自動在內存中創建這兩張表,不會存儲在數據庫中。這兩張表都是只讀的,不允許修改。這兩張表的結果總是與被觸發器應用的表的結構相同。當觸發器完成工作后,這兩張表就會被刪除。inserted表臨時保存了插入或更新后的記錄行,可以從inserted表中檢查插入的數據是否滿足業務需求,如果不滿足,則向用戶報告錯誤消息,并回滾插入操作。deleted表臨時保存了刪除或更新前的記錄行,可以從deleted表中檢查被刪除的數據是否滿足業務需求,如果不滿足,則向用戶報告錯誤消息,并回滾刪除操作。update數據的時候是先刪除表記錄,然后插入一條記錄,在inserted和deleted表就都有update后的數據記錄了。

  inserted表和deleted表存放的信息:

修改操作

inserted表

deleted表

增加(INSERT)記錄

存放新增的記錄

刪除(DELETE)記錄

存放被刪除的記錄

修改(UPDATE)記錄

存放更新后的記錄

存放更新前的記錄

 

三、創建觸發器

語法:

     CREATE TRIGGER trigger_name

     ON table_name

     [WITH ENCRYPTION]

     FOR [DELETE, INSERT, UPDATE]

     AS

       T-SQL語句

     GO

WITH ENCRYPTION表示加密觸發器定義的SQL文本

DELETE, INSERT, UPDATE指定觸發器的類型

 

1、創建insert類型的觸發器

插入觸發器

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

插入數據

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

SQL SERVER觸發器詳解

查詢數據

select * from MyStudentInfo where GradeId=11

SQL SERVER觸發器詳解

 

2、delete觸發器

刪除MyStudentInfo表中的數據,插入備份表

--刪除MyStudentInfo表中的數據,插入備份表
 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 "正在備份數據......"
 IF (object_id("MyStudentInfo_Back","U") is not null)
 --存在表,直接插入數據
   insert INTO MyStudentInfo_Back SELECT * from DELETED
 else
   select * into MyStudentInfo_Back from DELETED
 PRINT "備份完成"
  end

刪除前查詢MyStudentInfo表數據

select * from MyStudentInfo

SQL SERVER觸發器詳解

刪除id=9的數據

delete FROM MyStudentInfo where Id=9

SQL SERVER觸發器詳解

查詢備份表數據

select * from MyStudentInfo_Back

SQL SERVER觸發器詳解

 

3、update觸發器

  IF (object_id("tr_Update","tr") is not null)
     drop TRIGGER tr_Update
  GO
  CREATE trigger tr_Update
  on MyStudentInfo
  for update
  as
    begin
   --聲明變量,存儲更新前和更新后的姓名
   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

SQL SERVER觸發器詳解

update更新列級觸發器

 --update更新列級觸發器
   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 "系統提示:主鍵ID不能更新"
     rollback
   end
  end

SQL SERVER觸發器詳解

更新id列

update GradeInfo SET Id=15 where Id=4

SQL SERVER觸發器詳解

 

4、instead of觸發器

instead of觸發器表示并不執行其定義的操作(insert、update、delete)而僅是執行觸發器本身的內容,其優先級高于定義的SQL語句的執行

語法:

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

創建instead of觸發器

--創建instead of觸發器
/*MyStudentInfo表里面插入數據之前,先判斷GradeInfo表中是否有對應的班級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)

SQL SERVER觸發器詳解

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

insert INTO MyStudentInfo (GradeId) VALUES (5)

SQL SERVER觸發器詳解

 

DDL觸發器

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

測試刪除表

drop TABLE MyStudentInfo

SQL SERVER觸發器詳解

測試修改表結構

alter table MyStudentInfo
alter column Name varchar(32)

SQL SERVER觸發器詳解

禁用DML觸發器

disable trigger tr_insteadOf on MyStudentInfo

啟用DML觸發器

enable trigger tr_insteadOf on MyStudentInfo

禁用DDL觸發器

disable trigger tr_DDL on database

啟用DDL觸發器

enable trigger tr_DDL on database

到此這篇關于SQL SERVER觸發器詳解的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文地址:https://www.cnblogs.com/dotnet261010/p/5924238.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 情人我吃糖果小说 | 日韩在线一区二区三区 | 日本高清不卡一区久久精品 | 91制片厂制作果冻传媒八夷 | 亚洲欧美天堂综合久久 | 婷婷色六月 | 国产播放器一区 | 91九色国产porny | 超兴奋朋友的中文字幕下 | 欧美另类videos另类粗暴 | 亚洲 欧美 制服 校园 动漫 | www.亚洲色图 | 97视频久久久 | 99久热只有精品视频免费观看17 | 香蕉久久一区二区不卡无毒影院 | 99热在线获取最新地址 | 亚洲国产午夜看片 | 操女b| yellow最新视频2019 | 青草久久精品亚洲综合专区 | 日本高清免费不卡在线播放 | av中文字幕网免费观看 | 色戒 完整版 | 精东影业传媒全部作品 | 狠狠色狠狠色综合日日小蛇 | 天海翼三级 | 男女拍拍拍免费视频网站 | 暖暖 免费 高清 中文 日本 | 日本深夜视频 | freexxxxxhd张柏芝 | 1769亚洲欧美资源站 | 国产欧美国产精品第一区 | 欧美区日韩区 | caoporm碰最新免费公开视频 | 国语视频高清在线观看 | 日本老妇人乱视频 | 激情小视频 | 国产午夜成人无码免费看 | 夫承子液by免费阅读 | 艾秋麻豆果冻剧传媒在线播放 | 500av导航大全精品 |