SQL Server觸發器總結

觸發器的簡介:

觸發器(trigger)是SQL server 提供給程序員和數據分析員來保證數據完整性的一種方法,它是與表事件相關的特殊的存儲過程,它的執行不是由程序調用,也不是手工啓動,而是由事件來觸發,好比當對一個表進行操做( insert,delete, update)時就會激活它執行。觸發器常常用於增強數據的完整性約束和業務規則等。 觸發器能夠從 DBA_TRIGGERS ,USER_TRIGGERS 數據字典中查到。SQL3的觸發器是一個能由系統自動執行對數據庫修改的語句。

觸發器能夠查詢其餘表,並且能夠包含複雜的sql語句。它們主要用於強制服從複雜的業務規則或要求。例如:您能夠根據客戶當前的賬戶狀態,控制是否容許插入新訂單。程序員

觸發器也可用於強制引用完整性,以便在多個表中添加、更新或刪除行時,保留在這些表之間所定義的關係。然而,強制引用完整性的最好方法是在相關表中定義主鍵和外鍵約束。若是使用數據庫關係圖,則能夠在表之間建立關係以自動建立外鍵約束。sql

觸發器與存儲過程的惟一區別是觸發器不能執行EXECUTE語句調用,而是在用戶執行Transact-SQL語句時自動觸發執行。數據庫

此外觸發器是邏輯電路的基本單元電路,具備記憶功能,可用於二進制數據儲存,記憶信息等。ide

------來源於百度百科測試

觸發器的做用:

  • 可在寫入數據表前,強制檢驗或轉換數據。
  • 觸發器發生錯誤時,異動的結果會被撤銷。
  • 部分數據庫管理系統能夠針對數據定義語言(DDL)使用觸發器,稱爲DDL觸發器。
  • 可依照特定的狀況,替換異動的指令 (INSTEAD OF)。

觸發器的優勢:

觸發器可經過數據庫中的相關表實現級聯更改,不過,經過級聯引用完整性約束能夠更有效地執行這些更改。觸發器能夠強制用比CHECK約束定義的約束更爲複雜的約束。與 CHECK 約束不一樣,觸發器能夠引用其它表中的列。例如,觸發器可使用另外一個表中的 SELECT 比較插入或更新的數據,以及執行其它操做,如修改數據或顯示用戶定義錯誤信息。觸發器也能夠評估數據修改先後的表狀態,並根據其差別採起對策。一個表中的多個同類觸發器(INSERT、UPDATE 或 DELETE)容許採起多個不一樣的對策以響應同一個修改語句。

慎用觸發器:

觸發器功能強大,輕鬆可靠地實現許多複雜的功能,爲何又要慎用呢。觸發器自己沒有過錯,但因爲咱們的濫用會形成數據庫及應用程序的維護困難。在數據庫操做中,咱們能夠經過關係、觸發器、存儲過程、應用程序等來實現數據操做…… 同時規則、約束、缺省值也是保證數據完整性的重要保障。若是咱們對觸發器過度的依賴,勢必影響數據庫的結構,同時增長了維護的複雜程度。

一:觸發器是一種特殊的存儲過程,它不能被顯式地調用,而是在往表中插入記錄﹑更新記錄或者刪除記錄時被自動地激活。

**因此觸發器能夠用來實現對錶實施複雜的完整性約束。ui

二:SQL Server爲每一個觸發器都建立了兩個專用表:Inserted表和Deleted表。

這兩個表由系統來維護,它們存在於內存中而不是在數據庫中。這兩個表的結構老是與被該觸發器做用的表的結構相同。觸發器執行 完成後,與該觸發器相關的這兩個表也被刪除。code

  Deleted表存放因爲執行Delete或Update語句而要從表中刪除的全部行。server

  Inserted表存放因爲執行Insert或Update語句而要向表中插入的全部行。事件

三:Instead of 和 After觸發器

  SQL Server2000提供了兩種觸發器:Instead of 和After 觸發器。這兩種觸發器的差異在於他們被激活的不一樣:內存

  Instead of觸發器用於替代引發觸發器執行的T-SQL語句。除表以外,Instead of 觸發器也能夠用於視圖,用來擴展視圖能夠支持的更新操做。

  After觸發器在一個Insert,Update或Deleted語句以後執行,進行約束檢查等動做都在After觸發器被激活以前發生。After觸發器只能用於表。

  一個表或視圖的每個修改動做(insert,update和delete)均可以有一個instead of 觸發器,一個表的每一個修改動做均可以有多個After觸發器。

四:觸發器的執行過程

  若是一個Insert﹑update或者delete語句違反了約束,那幺After觸發器不會執行,由於對約束的檢查是在After觸發器被激活以前發生的。因此After觸發器不能超越約束。

  Instead of 觸發器能夠取代激活它的操做來執行。它在Inserted表和Deleted表剛剛創建,其它任何操做尚未發生時被執行。由於Instead of 觸發器在約束以前執行,因此它能夠對約束進行一些預處理。

五:使用T-SQL語句來建立觸發器

基本語句以下:

create trigger trigger_name

  on {table_name | view_name}

  {for | After | Instead of }

  [ insert, update,delete ]

  as

  sql_statement

六:刪除觸發器:

基本語句以下:

drop trigger trigger_name

七:查看數據庫中已有觸發器:

 -- 查看數據庫已有觸發器

use jxcSoftware

  go

  select * from sysobjects where xtype='TR'

-- 查看單個觸發器

exec sp_helptext '觸發器名'

八:修改觸發器:

基本語句以下:

alter trigger trigger_name

  on {table_name | view_name}

  {for | After | Instead of }

  [ insert, update,delete ]

  as

  sql_statement

九:觸發器實例

建立表student表

use triggerTest;
-- 建立student表
create table Student
(ID        int
primary key identity(1, 1),
studentID int --學號
);

建立borrowRecord表

--建立borrowRecord表
create table Borrowrecord
(   --學生借書記錄表
BorrowRecord int identity(1, 1), --流水號
studentID    int, --學號
BorrowDate   datetime, --借出時間
ReturnDate   datetime, --歸還時間

);

添加測試數據

INSERT into Student(studentID) values(1)
INSERT into Student(studentID) values(2)
INSERT into BorrowRecord(studentID,BorrowDate,ReturnDAte) VALUES(1,getdate(),getdate()+1)
INSERT into BorrowRecord(studentID,BorrowDate,ReturnDAte) VALUES(2,getdate(),getdate()+1)

觸發器的編寫

--編寫一個觸發器 功能:若是我更改了學生的學號,我但願他的借書記錄仍然與這個學生相關(也就是同時更改借書記錄表的學號);
create trigger truStudent on Student --在Student表中建立觸發器
for update --爲何事件觸發
as

--事件觸發後要作的事情
 if update(studentID)
     begin
         declare @stuidnew int;  --從臨時表Inserted記錄新的學號ID
         declare @stuidold int;   --從臨時表Delete記錄更新之前舊的學號ID
         select @stuidold = studentID
         from deleted;
         select @stuidnew = studentID
         from inserted;
         update Borrowrecord
           set 
               studentID = @stuidnew
         where studentID = @stuidold;
         print @stuidnew;
         print @stuidold;
 end;

go

測試觸發器

--測試觸發器
update Student
set

studentID = 111

where studentID = 1;

以上代碼親測有效!

總結:

重點是知道觸發器主要的2張表:

--觸發器的操做 deleted表和inserted表的數據變化 --插入操做(Insert) Inserted表有數據,Deleted表無數據 --刪除操做(Delete) --Inserted表無數據,Deleted表有數據 --更新操做(Update) --Inserted表有數據(新數據),Deleted表有數據(舊數據)

文章持續更新,若是喜歡,請拿起大家可愛的小手,給我點個贊吧!

點贊是一種積極的生活態度,贊一個吧!

相關文章
相關標籤/搜索