觸發器(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
這兩個表由系統來維護,它們存在於內存中而不是在數據庫中。這兩個表的結構老是與被該觸發器做用的表的結構相同。觸發器執行 完成後,與該觸發器相關的這兩個表也被刪除。code
Deleted表存放因爲執行Delete或Update語句而要從表中刪除的全部行。server
Inserted表存放因爲執行Insert或Update語句而要向表中插入的全部行。事件
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 觸發器在約束以前執行,因此它能夠對約束進行一些預處理。
基本語句以下:
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
use triggerTest;
-- 建立student表
create table Student
(ID int
primary key identity(1, 1),
studentID int --學號
);
--建立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表有數據(舊數據)
文章持續更新,若是喜歡,請拿起大家可愛的小手,給我點個贊吧!
點贊是一種積極的生活態度,贊一個吧!