DELIMITER | CREATE TRIGGER `<databaseName>`.`<triggerName>` < [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] > ON [dbo]<tableName> //dbo表明該表的全部者 FOR EACH ROW BEGIN --do something END |
觸發器可經過數據庫中的相關表實現級聯更改,不過,經過級聯引用完整性約束能夠更有效地執行這些更改。觸發器能夠強制比用CHECK約 束定義的約束更爲複雜的約束。與 CHECK 約束不一樣,觸發器能夠引用其它表中的列。例如,觸發器可使用另外一個表中的 SELECT 比較插入或更新的數據,以及執行其它操做,如修改數據或顯示用戶定義錯誤信息。觸發器也能夠評估數據修改先後的表狀態,並根據其差別採起對策。一個表中的 多個同類觸發器(INSERT、UPDATE 或 DELETE)容許採起多個不一樣的對策以響應同一個修改語句。sql
約束和觸發器在特殊狀況下各有優點。觸發器的主要好處在於它們能夠包含使用 Transact-SQL 代碼的複雜處理邏輯。所以,觸發器能夠支持約束的全部功能;但它在所給出的功能上並不老是最好的方法。實體完整性總應在最低級別上經過索引進行強制,這些 索引或是 PRIMARY KEY 和 UNIQUE 約束的一部分,或是在約束以外獨立建立的。假設功能能夠知足應用程序的功能需求,域完整性應經過 CHECK 約束進行強制,而引用完整性(RI) 則應經過 FOREIGN KEY 約束進行強制。在約束所支持的功能沒法知足應用程序的功能要求時,觸發器就極爲有用。數據庫
例如:除非 REFERENCES 子句定義了級聯引用操做,不然 FOREIGN KEY 約束只能以與另外一列中的值徹底匹配的值來驗證列值。測試
CHECK 約束只能根據邏輯表達式或同一表中的另外一列來驗證列值。若是應用程序要求根據另外一個表中的列驗證列值,則必須使用觸發器。約束只能經過標準的系統錯誤信息傳遞錯誤信息。若是應用程序要求使用(或能從中獲益)自定義信息和較爲複雜的錯誤處理,則必須使用觸發器。spa
觸發器可經過數據庫中的相關表實現級聯更改;不過,經過級聯引用完整性約束能夠更有效地執行這些更改。觸發器能夠禁 止或回滾違反引用完整性的更改,從而取消所嘗試的數據修改。當更改外鍵且新值與主鍵不匹配時,此類觸發器就可能發生做用。例如,能夠在 titleauthor.title_id 上建立一個插入觸發器,使它在新值與 titles.title_id 中的某個值不匹配時回滾一個插入。不過,一般使用 FOREIGN KEY 來達到這個目的。code
若是觸發器表上存在約束,則在 INSTEAD OF 觸發器執行後但在 AFTER 觸發器執行前檢查這些約束。若是約束破壞,則回滾 INSTEAD OF 觸發器操做而且不執行 AFTER 觸發器。server
觸發器到底可不能夠在視圖上建立 在 SQL Server™ 聯機叢書中,是沒有說觸發器不能在視圖上建立的, 而且在語法解釋中代表:在 CREATE TRIGGER 的 ON 以後能夠是視圖。 然而,事實彷佛並非如此,不少專家也說觸發器不能在視圖上建立。我也專門做了測試,的確如此,不論是普通視圖仍是索引視圖,都沒法在上面建立觸發器,真 的是這樣嗎?htm
可是無可厚非的是:當在臨時表或系統表上建立觸發器時會遭到拒絕。索引
深入理解 FOR CREATE TRIGGER 語句的 FOR 關鍵字以後能夠跟 INSERT、UPDATE、DELETE 中的一個或多個,也就是說在其它狀況下是不會觸發觸發器的, 包括 SELECT、TRUNCATE、WRITETEXT、UPDATETEXT。get
相關內容 一個有趣的應用咱們看到許多註冊系統在註冊後都不能更改用戶名,但這多半是由應用程序決定的, 若是直接打開數據庫表進行更改,一樣能夠更改其用戶名, 在觸發器中利用回滾就能夠巧妙地實現沒法更改用戶名……詳細內容 觸發器內部語句出錯時…… 這種狀況下,前面對數據更改操做將會無效。舉個例子,在表中插入數據時觸發觸發器,而觸發器內部此時發生了運行時錯誤,那麼將返回一個錯誤值,而且拒絕剛 才的數據插入。不能在觸發器中使用的語句 觸發器中可使用大多數 T-SQL 語句,但以下一些語句是不能在觸發器中使用的。it
CREATE 語句,如:CREATE DATABASE、CREATE TABLE、CREATE INDEX 等。
ALTER 語句,如:ALTER DATABASE、ALTER TABLE、ALTER INDEX 等。
DROP 語句,如:DROP DATABASE、DROP TABLE、DROP INDEX 等。
DISK 語句,如:DISK INIT、DISK RESIZE。
LOAD 語句,如:LOAD DATABASE、LOAD LOG。
RESTORE 語句,如:RESTORE DATABASE、RESTORE LOG。
RECONFIGURE
TRUNCATE TABLE 語句在sybase的觸發器中不可以使用!
觸發器功能強大,輕鬆可靠地實現許多複雜的功能,爲何又要慎用呢。觸發器自己沒有過錯,但因爲咱們的濫用會形成數據庫及應用程序的維護困難。在數據庫操做中,咱們能夠經過關係、觸發器、存儲過程、應用程序等來實現數據操做…… 同時規則、約束、缺省值也是保證數據完整性的重要保障。若是咱們對觸發器過度的依賴,勢必影響數據庫的結構,同時增長了維護的複雜程度。
insert 觸發器示例 create trigger tri_insert on student for insert as declare @student_id char(10) select @student_id=s.student_id from student s inner join inserted i on s.student_id=i.student_id if @student_id='0000000001' begin raiserror('不能插入1的學號!',16,8) rollback tran end go
update觸發器示例 create trigger tri_update on student for update as if update(student_id) begin raiserror('學號不能修改!',16,8) rollback tran end go
delete觸發器示例 create trigger tri_delete on student for delete as declare @student_id varchar(10) select @student_id=student_id from deleted if @student_id='admin' begin raiserror('錯誤',16,8) rollback tran end