當前位置:首頁 » 編程語言 » sql觸發程序

sql觸發程序

發布時間: 2024-03-04 06:13:28

sql中觸發器有什麼作用

觸發器(trigger)是SQL server 提供給程序員和數據分析員來保證數據完整性的一種方法,它是與表事件相關的特殊的存儲過程,它的執行不是由程序調用,也不是手工啟動,而是由事件來觸發,比如當對一個表進行操作( insert,delete, update)時就會激活它執行。觸發器經常用於加強數據的完整性約束和業務規則等。 觸發器可以從 DBA_TRIGGERS ,USER_TRIGGERS 數據字典中查到。SQL3的觸發器是一個能由系統自動執行對資料庫修改的語句。x0dx0a 觸發器與存儲過程的唯一區別是觸發器不能執行EXECUTE語句調用,而是在用戶執行Transact-SQL語句時自動觸發執行。x0dx0a 觸發器可以查詢其他表,而且可以包含復雜的SQL語句。它們主要用於強制服從復雜的業務規則或要求。例如:您可以根據客戶當前的帳戶狀態,控制是否允許插入新訂單。x0dx0a觸發器也可用於強制引用完整性,以便在多個表中添加、更新或刪除行時,保留在這些表之間所定義的關系。然而,強制引用完整性的最好方法是在相關表中定義主鍵和外鍵約束。如果使用資料庫關系圖,則可以在表之間創建關系以自動創建外鍵約束。x0dx0a SQL Server 包括三種常規類型的觸發器:DML 觸發器、DDL 觸發器和登錄觸發器。x0dx0a 語法為:x0dx0a CREATE TRIGGER ``.``x0dx0a < [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >x0dx0a ON [dbo] //dbo代表該表的所有者x0dx0a FOR EACH ROWx0dx0a BEGINx0dx0a --do somethingx0dx0a ENDx0dx0a 觸發器可通過資料庫中的相關表實現級聯更改,不過,通過級聯引用完整性約束可以更有效地執行這些更改。觸發器可以強制比用CHECK約束定義的約束更為復雜的約束。與 CHECK 約束不同,觸發器可以引用其它表中的列。例如,觸發器可以使用另一個表中的 SELECT 比較插入或更新的數據,以及執行其它操作,如修改數據或顯示用戶定義錯誤信息。觸發器也可以評估數據修改前後的表狀態,並根據其差異採取對策。一個表中的多個同類觸發器(INSERT、UPDATE 或 DELETE)允許採取多個不同的對策以響應同一個修改語句。x0dx0a 約束和觸發器在特殊情況下各有優勢。觸發器的主要好處在於它們可以包含使用 Transact-SQL 代碼的復雜處理邏輯。因此,觸發器可以支持約束的所有功能;但它在所給出的功能上並不總是最好的方法。實體完整性總應在最低級別上通過索引進行強制,這些索引或是 PRIMARY KEY 和 UNIQUE 約束的一部分,或是在約束之外獨立創建的。假設功能可以滿足應用程序的功能需求,域完整性應通過 CHECK 約束進行強制,而引用完整性(RI) 則應通過 FOREIGN KEY 約束進行強制。在約束所支持的功能無法滿足應用程序的功能要求時,觸發器就極為有用。x0dx0a CHECK 約束只能根據邏輯表達式或同一表中的另一列來驗證列值。如果應用程序要求根據另一個表中的列驗證列值,則必須使用觸發器。約束只能通過標準的系統錯誤信息傳遞錯誤信息。如果應用程序要求使用(或能從中獲益)自定義信息和較為復雜的錯誤處理,則必須使用觸發器。x0dx0a 觸發器可通過資料庫中的相關表實現級聯更改;不過,通過級聯引用完整性約束可以更有效地執行這些更改。觸發器可以禁止或回滾違反引用完整性的更改,從而取消所嘗試的數據修改。當更改外鍵且新值與主鍵不匹配時,此類觸發器就可能發生作用。例如,可以在 titleauthor.title_id 上創建一個插入觸發器,使它在新值與 titles.title_id 中的某個值不匹配時回滾一個插入。不過,通常使用 FOREIGN KEY 來達到這個目的。x0dx0a 如果觸發器表上存在約束,則在 INSTEAD OF 觸發器執行後但在 AFTER 觸發器執行前檢查這些約束。如果約束破壞,則回滾 INSTEAD OF 觸發器操作並且不執行 AFTER 觸發器。x0dx0a實例1:insert觸發器x0dx0acreate trigger tri_insertx0dx0aon studentx0dx0afor insertx0dx0aasx0dx0adeclare @student_id char(10)x0dx0aselect @student_id=s.student_id fromx0dx0astudent s inner join inserted ix0dx0aon s.student_id=i.student_idx0dx0aif @student_id=�'x0dx0abeginx0dx0araiserror('不能插入1的學號!',16,8)x0dx0arollback tranx0dx0aendx0dx0agox0dx0a實例2:update觸發器x0dx0acreate trigger tri_updatex0dx0aon studentx0dx0afor updatex0dx0aasx0dx0aif update(student_id)x0dx0abeginx0dx0araiserror('學號不能修改!',16,8)x0dx0arollback tranx0dx0aendx0dx0agox0dx0a實例3:delete觸發器示x0dx0acreate trigger tri_deletex0dx0aon studentx0dx0afor deletex0dx0aasx0dx0adeclare @student_id varchar(10)x0dx0aselect @student_id=student_id from deletedx0dx0aif @student_id='admin'x0dx0abeginx0dx0araiserror('錯誤',16,8)x0dx0arollback tranx0dx0aend

Ⅱ SQL中,觸發器是什麼

1. 基本概念x0dx0a觸發器是特殊的存儲過程,基於一個表創建,主要作用就是實現由主鍵和外鍵所不能保證的復雜的參照完整性和數據一致性。x0dx0a當觸發器所保護的數據發生變化(update,insert,delete)後,自動運行以保證數據的完整性和正確性。通俗的說:通過一個動作(update,insert,delete)調用一個存儲過程(觸發器)。x0dx0a2. 類型x0dx0a(1)DML觸發器x0dx0a在資料庫中發生數據操作語言(DML)事件時將啟用。DML 事件包括在指定表或視圖中修改數據的 INSERT 語句、UPDATE 語句或 DELETE 語句。DML 觸發器可以查詢其他表,還可以包含復雜的 T-SQL 語句。系統將觸發器和觸發它的語句作為可在觸發器內回滾的單個事務對待,如果檢測到錯誤(例如,磁碟空間不足),則整個事務即自動回滾。x0dx0a(2)DDL 觸發器x0dx0aSQL Server 2005 的新增功能。當伺服器或資料庫中發生數據定義語言(DDL)事件時將調用這些觸發器。但與DML觸發器不同的是,它們不會為響應針對表或視圖的UPDATE、INSERT或DELETE語句而激發,相反,它們會為響應多種數據定義語言(DDL)語句而激發。這些語句主要是以CREATE、ALTER和DROP開頭的語句。DDL觸發器可用於管理任務,例如審核和控制資料庫操作。x0dx0a 創建DML觸發器x0dx0a1. 使用存儲過程模板創建存儲過程x0dx0a在【對象資源管理器】窗口中,展開「資料庫」節點,再展開所選擇的具體資料庫節點,再展開「表」節點,右擊要創建觸發器的「表」,選擇「新建觸發器」命令,如圖所示:x0dx0a在右側查詢編輯器中出現觸發器設計模板,用戶可以在此基礎上編輯觸發器,單擊「執行」按鈕,即可創建該觸發器。x0dx0ax0dx0a2. 使用T-SQL語句創建表x0dx0aCREATE TRIGGER 觸發器x0dx0aON 表名x0dx0aFOR[update,insert,delete ]x0dx0aAS SQL語句x0dx0a例9-6:創建基於表reader ,DELETE操作的觸發器。x0dx0aUSE Libraryx0dx0aGOx0dx0aIF EXISTS(SELECT name FROM sysobjectsx0dx0a WHERE name='reader_d' AND type='TR')x0dx0aDROP TRIGGER reader_d --如果已經存在觸發器reader_d則刪除x0dx0aGOx0dx0aCREATE TRIGGER reader_d --創建觸發器x0dx0aON reader --基於表 x0dx0aFOR DELETE --刪除事件x0dx0aASx0dx0aPRINT '數據被刪除!' --執行顯示輸出x0dx0aGOx0dx0a 試試吧!x0dx0a應用:x0dx0aUSE Libraryx0dx0aGOx0dx0aDELETE readerx0dx0awhere Rname='aaa'x0dx0a執行結果:x0dx0a數據被刪除!x0dx0a(所影響的行數為 1 行)x0dx0a例9-7:在表borrow中添加借閱信息記錄時,得到該書的應還日期。x0dx0a說明:在表borrow中增加一個應還日期SReturnDate。x0dx0aUSE Libraryx0dx0aIF EXISTS (SELECT name FROM sysobjectsx0dx0aWHERE name ='T_return_date' AND type='TR')x0dx0aDROP TRIGGER T_return_datex0dx0aGOx0dx0aCREATE TRIGGER T_return_date --創建觸發器x0dx0aON Borrow --基於表borrowx0dx0aAfter INSERT --插入操作x0dx0aASx0dx0a--查詢插入記錄INSERTED中讀者的類型x0dx0aDECLARE @type int,@dzbh char(10),@tsbh char(15)x0dx0aSET @dzbh=(SELECT RID FROM inserted)x0dx0aSET @tsbh=(SELECT BID FROM inserted)x0dx0aSELECT @type= TypeIDx0dx0aFROM readerx0dx0aWHERE RID=(SELECT RID FROM inserted)--副本x0dx0a/*把Borrow表中的應還日期改為x0dx0a當前日期加上各類讀者的借閱期限*/x0dx0aUPDATE Borrow SET SReturnDate=getdate()+x0dx0aCASE x0dx0a WHEN @type=1 THEN 90x0dx0a WHEN @type=2 THEN 60x0dx0a WHEN @type=3 THEN 30x0dx0aENDx0dx0aWHERE RID=@dzbh and BID=@tsbhx0dx0a應用:x0dx0aUSE Libraryx0dx0aINSERT INTO borrow(RID,BID) values(�','TP85-08')x0dx0a查看記錄:x0dx0a x0dx0a例9-8:在資料庫Library中,當讀者還書時,實際上要修改表brorrowinf中相應記錄還期列的值,請計算出是否過期。x0dx0aUSE Libraryx0dx0aIF EXISTS(SELECT name FROM sysobjectsx0dx0aWHERE name='T_fine_js' AND type='TR')x0dx0aDROP TRIGGER T_fine_jsx0dx0aGOx0dx0aCREATE TRIGGER T_fine_jsx0dx0aON borrowx0dx0aAfter UPDATEx0dx0aASx0dx0aDECLARE @days int,@dzbh char(10),@tsbh char(15)x0dx0aSET @dzbh=(select RID from inserted)x0dx0aSET @tsbh=(select BID from inserted)x0dx0aSELECT @days=DATEDIFF(day, ReturnDate, SReturnDate)x0dx0a--DATEDIFF函數返回兩個日期之差,單位為DAYx0dx0aFROM borrowx0dx0aWHERE RID=@dzbh and BID=@tsbhx0dx0aIF @days>0x0dx0a PRINT '沒有過期!'x0dx0aELSEx0dx0a PRINT '過期'+convert(char(6),@days)+'天'x0dx0aGOx0dx0a應用:x0dx0aUSE Libraryx0dx0aUPDATE borrow SET ReturnDate=񟭇-12-12'x0dx0aWHERE RID=�' and BID='TP85-08'x0dx0aGOx0dx0a執行結果:x0dx0a過期-157 天x0dx0a(1 行受影響)x0dx0a例9-9:對Library庫中Reader表的 DELETE操作定義觸發器。x0dx0aUSE Libraryx0dx0aGOx0dx0aIF EXISTS(SELECT name FROM sysobjectsx0dx0a WHERE name='reader_d' AND type='TR')x0dx0aDROP TRIGGER reader_dx0dx0aGOx0dx0aCREATE TRIGGER reader_dx0dx0aON Readerx0dx0aFOR DELETEx0dx0aASx0dx0aDECLARE @data_yj intx0dx0aSELECT @data_yj=Lendnumx0dx0aFROM deletedx0dx0aIF @data_yj>0x0dx0a BEGINx0dx0a PRINT '該讀者不能刪除!還有'+convert(char(2),@data_yj)+'本書沒還。x0dx0a ROLLBACKx0dx0a ENDx0dx0aELSEx0dx0a PRINT '該讀者已被刪除!'x0dx0aGOx0dx0a應用:x0dx0aUSE Libraryx0dx0aGOx0dx0aDELETE Reader WHERE RID=�'x0dx0a執行結果:x0dx0a該讀者不能刪除!還有4 本書沒還。x0dx0a 修改觸發器x0dx0aALTER TRIGGER 觸發器x0dx0a 刪除觸發器x0dx0aDROP TRIGGER 觸發器x0dx0a 查看觸發器x0dx0asp_helptext trigger_namex0dx0asp_helptrigger table_name

Ⅲ SQl中觸發器怎樣執行的

創建觸發器 是特殊的存儲過程,自動執行,一般不要有返回值。

1、後觸發器 (AFTER,FOR)先執行對應語句,後執行觸發器中的語句。

2、前觸發器 並沒有真正的執行觸發語句(insert,update,delete),而是執行觸發後的語句。

3、行級觸發器 (FOR EACH ROW) 在SQL server 中不存在。

(3)sql觸發程序擴展閱讀:

創建觸發的語法

CREATE TRIGGER trigger_name --觸發器名稱

ON table_name --觸發的表

[WITH ENCRYPTION]

FOR [DELETE, INSERT, UPDATE] --選擇觸發器類型

AS --觸發後要做的語句

T-SQL語句

GO --結束標記

Ⅳ sql 觸發器如何指定欄位更新才觸發

1、首先,嘗試創建一個觸發器,要求就是在AddTable這個表上創建一個Update觸發器。

c語言怎麼使用sql觸發器

c語言怎麼使用sql觸發器:
定義: 何為觸發器?在SQL Server裡面也就是對某一個表的一定的操作,觸發某種條件,從而執行的一段程序。觸發器是一個特殊的存儲過程。
常見的觸發器有三種:分別應用於Insert , Update , Delete 事件。

我為什麼要使用觸發器?比如,這么兩個表:

Create Table Student( --學生表
StudentID int primary key, --學號
....
)

Create Table BorrowRecord( --學生借書記錄表
BorrowRecord int identity(1,1), --流水號
StudentID int , --學號
BorrowDate datetime, --借出時間
ReturnDAte Datetime, --歸還時間
...
)

用到的功能有:
1.如果我更改了學生的學號,我希望他的借書記錄仍然與這個學生相關(也就是同時更改借書記錄表的學號);
2.如果該學生已經畢業,我希望刪除他的學號的同時,也刪除它的借書記錄。
等等。

這時候可以用到觸發器。對於1,創建一個Update觸發器:

Create Trigger truStudent
On Student --在Student表中創建觸發器
for Update --為什麼事件觸發
As --事件觸發後所要做的事情
if Update(StudentID)
begin

Update BorrowRecord
Set StudentID=i.StudentID
From BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted臨時表
Where br.StudentID=d.StudentID

end

理解觸發器裡面的兩個臨時的表:Deleted , Inserted 。注意Deleted 與Inserted分別表示觸發事件的表「舊的一條記錄」和「新的一條記錄」。
一個資料庫系統中有兩個虛擬表用於存儲在表中記錄改動的信息,分別是:
虛擬表Inserted 虛擬表Deleted

在表記錄新增時 存放新增的記錄 不存儲記錄
修改時 存放用來更新的新記錄 存放更新前的記錄
刪除時 不存儲記錄 存放被刪除的記錄

一個Update 的過程可以看作為:生成新的記錄到Inserted表,復制舊的記錄到Deleted表,然後刪除Student記錄並寫入新紀錄。

對於2,創建一個Delete觸發器
Create trigger trdStudent
On Student
for Delete
As
Delete BorrowRecord
From BorrowRecord br , Delted d
Where br.StudentID=d.StudentID

從這兩個例子我們可以看到了觸發器的關鍵:A.2個臨時的表;B.觸發機制。

Ⅵ SQL中的「觸發器」是什麼

觸發器是對表進行插入、更新、刪除的時候會自動執行的特殊存儲過程。x0dx0ax0dx0a觸發器一般用在check約束更加復雜的約束上面。例如在執行update、insert、delete這些操作的時候,系統會自動調用執行該表上對應的觸發器。x0dx0ax0dx0aSQL Server 2005中觸發器可以分為兩類:DML觸發器和DDL觸發器,其中DDL觸發器它們會影響多種數據定義語言語句而激發,這些語句有create、alter、drop語句。 x0dx0ax0dx0a DML觸發器分為: x0dx0a 1、 after觸發器(之後觸發) x0dx0a a、 insert觸發器 x0dx0a b、 update觸發器 x0dx0a c、 delete觸發器 x0dx0a 2、 instead of 觸發器 (之前觸發) x0dx0ax0dx0a其中after觸發器要求只有執行某一操作insert、update、delete之後觸發器才被觸發,且只能定義在表上。而instead of觸發器表示並不執行其定義的操作(insert、update、delete)而僅是執行觸發器本身。既可以在表上定義instead of觸發器,也可以在視圖上定義。 x0dx0ax0dx0a觸發器有兩個特殊的表:插入表(instered表)和刪除表(deleted表)。這兩張是邏輯表也是虛表。有系統在內存中創建者兩張表,不會存儲在資料庫中。而且兩張表的都是只讀的,只能讀取數據而不能修改數據。這兩張表的結果總是與被改觸發器應用的表的結構相同。當觸發器完成工作後,這兩張表就會被刪除。Inserted表的數據是插入或是修改後的數據,而deleted表的數據是更新前的或是刪除的數據。x0dx0ax0dx0aUpdate數據的時候就是先刪除表記錄,然後增加一條記錄。這樣在inserted和deleted表就都有update後的數據記錄了。注意的是:觸發器本身就是一個事務,所以在觸發器裡面可以對修改數據進行一些特殊的檢查。如果不滿足可以利用事務回滾,撤銷操作。

熱點內容
python外包 發布:2024-11-29 06:49:11 瀏覽:424
怎麼用安卓手機查蘋果的序列號 發布:2024-11-29 06:21:08 瀏覽:507
r11s原始密碼是多少 發布:2024-11-29 05:52:20 瀏覽:79
c語言枚舉法 發布:2024-11-29 05:50:58 瀏覽:125
大數據系統如何配置 發布:2024-11-29 05:48:44 瀏覽:89
連戰訪問西安小學 發布:2024-11-29 05:45:03 瀏覽:316
怎麼編譯原生安卓手機 發布:2024-11-29 05:44:28 瀏覽:193
java代碼編譯java文件 發布:2024-11-29 05:44:27 瀏覽:208
如何部署遠程伺服器 發布:2024-11-29 05:34:37 瀏覽:523
紅米系統存儲與手機存儲 發布:2024-11-29 05:33:55 瀏覽:198