觸發器是什麼?
觸發器到底是什麼意思?
觸發器是是打包好的sql語法,執行它的條件是當被設定改觸發器的表有變化的時候.比如我可以寫一個觸發器,設定它在插入一筆數據到這個表裡的時候,去同步另一個表.那麼在程序裡我只要做到往數據庫裡插一筆數據,那麼另一個表就可以同時被更新.
什麼是觸發器?
觸發器是一種特殊的存儲過程,它在試圖更改觸發器所保護的數據時自動執行。
它被定義為在對錶或視圖發出 UPDATE、INSERT 或 DELETE 語句時自動執行,在有數據修改時自動強制執行其業務規則。
觸發器可以擴展 SQL Server 約束、默認值和規則的完整性檢查邏輯,但只要約束和默認值提供了全部所需的功能,就應使用約束和默認值。
*/
-- 觸發器的特點
/*
與表相關聯
觸發器定義在特定的表上,這個表稱為觸發器表。
自動激活觸發器
當對錶中的數據執行 INSERT、UPDATE 或 DELETE 操作時,如果對錶上的這個特定操作定義了觸發器,該觸發器自動執行,這是不可撤銷的。
不能直接調用
與存儲過程不同,觸發器不能被直接調用,也不能傳遞或接受參數。
作為事務的一部分
觸發器與激活觸發器的語句一起做為對一個單一的事務來對待,可以從觸發器中的任何位置回滾。
當使用觸發器時,應該考慮以下事實和知道原則:
即使不存在顯式的 BEGIN TRANSACTION 語句,在觸發器的定義中也可以包括 ROLLBACK TRANSACTION 語句
如果遇到一個 ROLLBACK TRANSACTION 語句,則整個事務回滾。如果在觸發器腳本中跟隨在 ROLLBACK TRANSACTION 語句後還有別的語句,
這些語句將繼續被執行。需要的話,可以使用 RETURN 語句來防止這些語句的執行。
如果包括 ROLLBACK TRANSACTION 語句的觸發器在一個用戶定義的事務中被激活,這個 ROLLBACK TRANSACTION 語句撤銷整個事務。
在這個用戶定義的事務的批處理語句中,激活該觸發器的語句之後的語句將不再執行。
*/
-- 舉例
/*
use Test
GO
create table dbo.t_record(idx int identity(1,1),col_1 varchar(20))
insert t_record (col_1) values ('Row 01')
insert t_record (col_1) values ('Row 02')
insert t_record (col_1) values ('Row 03')
*/
create trigger tr_record_delete on dbo.t_record
for delete
as
/*
作用:當刪除表 t_record 中的記錄時,若一次刪除 1 條以上,則取消刪除
*/
if (select count(*) from deleted)>1
begin
raiserror('You cannot delete more than one record at a time',16,1)
rollback tran
end
Go
select * from t_record
delete t_record
select * from t_record
delete t_record where idx=1
-- 觸發器的使用
......
數據庫中的“觸發器”是什麼意思?
在SQL中,名詞觸發器指“在數據庫中為響應一個特殊表格中的某些事件而自動執行的程序代碼。”(Wikipedia)說得簡單一些,它是在一個特殊的數據庫事件,如INSERT或DELETE發生時,自動激活的一段代碼。觸發器可方便地用於日誌記錄、對單個表格到其他鏈接式表格進行自動的“層疊式”更改、或保證對錶格關係進行自動更新。當一個新整數值增加到數據庫域中時,自動更新運行的總數的代碼段是一個觸發器。自動記錄對一個特殊數據庫表格所作更改的SQL命令塊也是一個觸發器實例。 參考: www.nmzol.com/...2.html
什麼是觸發器
SQL觸發器實例1定義: 何為觸發器?在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 tr......
SQL中,觸發器是什麼?
1、觸發器。 定義: 何為觸發器?在SQL Server裡面也就是對某一個表的一定的操作,觸發某種條件,從而執行的一段程序。觸發器是一個特殊的存儲過程。 常見的觸發器有三種:分別應用於Insert , Update , Delete 事件。(SQL Server 2000定義了新的觸發器,這裡不提) 我為什麼要使用觸發器?比如,這麼兩個表: 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 for Update ------------------------------------------------------- --Name:truStudent --func:更新BorrowRecord 的StudentID,與Student同步。 --Use :None --User:System --Author: 懶蟲 # SapphireStudio ( www.chair3.com) --Date : 2003-4-16 --Memo : 臨時寫寫的,給大家作個Sample。沒有調試阿。 ------------------------------------------------------- As if Update(StudentID) begin Update BorrowRecord Set br.StudentID=i.StudentID From BorrowRecord br , Deleted d ,Inserted i Where br.StudentID=d.StudentID end 理解觸發器裡面的兩個臨時的表:Deleted , Inserted 。注意Deleted 與Inserted分別表示......
數據庫 觸發器有什麼用
觸發器
觸發器的定義就是說某個條件成立的時候,你觸發器裡面所定義的語句就會被自動的執行。因此觸發器不需要人為的去調用,也不能調用。
然後,觸發器的觸發條件其實在你定義的時候就已經設定好的了。這裡面需要說明一下,觸發器可以分為語句級觸發器和行級觸發器。詳細的介紹可以參考網上的資料,簡單的說就是語句級的觸發器可以在某些語句執行前或執行後被觸發。而行級觸發器則是在定義的了觸發的表中的行數據改變時就會被觸發一次。
具體舉例:
1. 在一個表中定義的語句級的觸發器,當這個表被刪除時,程序就會自動執行觸發器裡面定義的操作過程。這個就是刪除表的操作就是觸發器執行的條件了。
2. 在一個表中定義了行級的觸發器,那當這個表中一行數據發生變化的時候,比如刪除了一行記錄,那觸發器也會被自動執行了。
觸發器簡介:
觸發器是一種特殊類型的過程。與普通過程不同的是,過程需要用戶顯式地調用才執行,而觸發器則是當某些事件發生時,由Oracle自動執行。
觸發器主要由如下幾個部分組成:
觸發事件:
觸發條件:
觸發對象:
觸發操作:
編寫觸發器時,需要注意以下幾點:
觸發器不接受參數。
一個表上最多可以有12個觸發器,但同一時間、同一事件、同一類型的觸發器只能有一個。還需要注意,各個觸發器之間不能有矛盾。
在一個表上的觸發器越多,對在該表上的DML操作性能影響就越大。
觸發器最大為32KB。如果確實需要,可以先建立過程,然後在觸發器中用CALL語句調用。
在DML觸發器中只能使用DML語句(select,insert,update,delete)。
在系統觸發器中只能包含DDL語句(create,alter,drop)。
觸發器中不能包含事務控制語句(commit,rollback,savepoint)。因為觸發器是觸發語句的一部門,觸發語句被提交或回退時,觸發器也就被提交或回退了。
在觸發器主體中調用的任何過程、函數都不能使用事務控制語句。
在觸發器主體中不能聲明任何long和blob變量。新值new、舊值old也不能指向表中的任何long和blog列
不同類型的觸發器(如DML觸發器、INSTEAD OF觸發器、系統觸發器)的語法格式和作用都有較大區別。
SQL中觸發器有什麼作用
當你對錶進行了添刪改查等操作時,如果你需要做一些特定的業務操作,就可以使用觸發器。
顧名思義,觸發,當你做了某種預設的操作時才會執行觸發器的命令
舉個例子。。
假設你有個員工基礎信息表,裡面有員工的身份證號碼,手機等基本信息。。
那麼,當你換了身份證或手機,需要修改號碼的時候,肯定是去修改員工的基礎資料表。
假設你現在有別的地方,比如人事檔案啊之類的,同樣使用了員工的手機等信息。。難道你還要再去修改一次檔案表麼。。那麼如果還有其他地方使用了呢?
而觸發器就可以在這種時候做出判斷,如果修改了基礎表的信息,那麼就同步把其他使用了基礎表信息的地方也更改成最新的信息。。
大概就是這麼個意思。。當然還有其他的作用
什麼是觸發器,使用觸發器的好處是什麼
觸發器(trigger)是個特殊的存儲過程,它的執行不是由程序調用,也不是手工啟動,而是由個事件來觸發,比如當對一個表進行操作( insert,delete, update)時就會激活它執行。觸發器經常用於加強數據的完整性約束和業務規則等。 觸發器可以從 DBA_TRIGGERS ,USER_TRIGGERS 數據字典中查到。
觸發器可以查詢其他表,而且可以包含複雜的 SQL 語句。它們主要用於強制服從複雜的業務規則或要求。例如:您可以根據客戶當前的帳戶狀態,控制是否允許插入新訂單。
觸發器也可用於強制引用完整性,以便在多個表中添加、更新或刪除行時,保留在這些表之間所定義的關係。然而,強制引用完整性的最好方法是在相關表中定義主鍵和外鍵約束。如果使用數據庫關係圖,則可以在表之間創建關係以自動創建外鍵約束。
創建觸發器的SQL語法
DELIMITER |
CREATE TRIGGER `
< [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >
ON
FOR EACH ROW
BEGIN
--do something
END |
觸發器的優點
觸發器可通過數據庫中的相關表實現級聯更改;不過,通過級聯引用完整性約束可以更有效地執行這些更改。觸發器可以強制比用 CHECK 約束定義的約束更為複雜的約束。與 CHECK 約束不同,觸發器可以引用其它表中的列。例如,觸發器可以使用另一個表中的 SELECT 比較插入或更新的數據,以及執行其它操作,如修改數據或顯示用戶定義錯誤信息。觸發器也可以評估數據修改前後的表狀態,並根據其差異采取對策。一個表中的多個同類觸發器(INSERT、UPDATE 或 DELETE)允許採取多個不同的對策以響應同一個修改語句。
比較觸發器與約束
約束和觸發器在特殊情況下各有優勢。觸發器的主要好處在於它們可以包含使用 Transact-SQL 代碼的複雜處理邏輯。因此,觸發器可以支持約束的所有功能;但它在所給出的功能上並不總是最好的方法。實體完整性總應在最低級別上通過索引進行強制,這些索引或是 PRIMARY KEY 和 UNIQUE 約束的一部分,或是在約束之外獨立創建的。假設功能可以滿足應用程序的功能需求,域完整性應通過 CHECK 約束進行強制,而引用完整性 (RI) 則應通過 FOREIGN KEY 約束進行強制。在約束所支持的功能無法滿足應用程序的功能要求時,觸發器就極為有用。
例如:除非 REFERENCES 子句定義了級聯引用操作,否則 FOREIGN KEY 約束只能以與另一列中的值完全匹配的值來驗證列值。
CHECK 約束只能根據邏輯表達式或同一表中的另一列來驗證列值。如果應用程序要求根據另一個表中的列驗證列值,則必須使用觸發器。
約束只能通過標準的系統錯誤信息傳遞錯誤信息。如果應用程序要求使用(或能從中獲益)自定義信息和較為複雜的錯誤處理,則必須使用觸發器。
觸發器可通過數據庫中的相關表實現級聯更改;不過,通過級聯引用完整性約束可以更有效地執行這些更改。
觸發器可以禁止或回滾違反引用完整性的更改,從而取消所嘗試的數據修改。當更改外鍵且新值與主鍵不匹配時,此類觸發器就可能發生作用。例如,可以在 titleauthor.title_id ......
基本RS觸發器有什麼作用
基本RS觸發器、同步RS觸發器、邊沿RS觸發器,這些,
都屬於基礎。基本上,它們都沒有實用的場合。
組成 555 芯片內部還用到過它。
現在,早就沒有單獨使用它們的地方了。
這個觸發器構成什麼
這個電路是把一個JK觸發器的Q輸出端連接到K輸入端,把Q非輸出端連接到J輸入端,R(清零)和S(置1)都沒有使用,姑且認為都是置於0輸入(均無清零和置1作用)。
當JK觸發器處於0狀態(Q=0,Q非=1)時,K=0,J=1,CP信號來到時,觸發器翻轉為1狀態(Q=1,Q非=0);
當JK觸發器處於1狀態(Q=1,Q非=0)時,K=1,J=0,CP信號來到時,觸發器翻轉為0狀態(Q=0,Q非=1)。
因此這相當於一個一位二進制的計數器(分頻器),每來一次CP信號,它就翻轉一次。