它是個特殊的存儲過程,它的執行不是由程序調用,也不是手工啓動,而是由事件來觸發,比如當對一個表進行操作( insert,delete, update)時就會激活它執行。觸發器經常用於加強數據的完整性約束和業務規則等。觸發器可以從 DBA_TRIGGERS ,USER_TRIGGERS 數據字典中查到。
爲什麼要使用觸發器:
ü 可以使用它來檢查或預防壞的數據進入數據庫。
ü 可以改變或取消INSERT、UPDATE、以及DELETE語句。
ü 可以在一個會話中監視數據改變的動作。
創建觸發器:精華志京華志畢業設計輔導諮詢 [email protected]
CREATE [DEFINER = { user | CURRENT_USER }]
TRIGGER <觸發器名稱>
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON <表名稱>
FOR EACH ROW
<觸發的SQL語句>
說明:
DEFINER:The DEFINER clause specifies the MySQL account to be used when checking access privileges at trigger activation time. If a user value is given, it should be a MySQL account specified as 'user_name'@'host_name'。
觸發器名稱:觸發器必須有名字,最多64個字符,可能後面會附有分隔符.它和MySQL中其他對象的命名方式基本相象
觸發程序的動作時間:BEFORE AFTER. 可以設置爲事件發生前或後.
事件:指明瞭激活觸發程序的語句的類型。可以是下述值之一:
ü INSERT:將新行插入表時激活觸發程序,例如,通過INSERT、LOAD DATA和REPLACE語句。
ü UPDATE:更改某一行時激活觸發程序,例如,通過UPDATE語句。
ü DELETE:從表中刪除某一行時激活觸發程序,例如,通過DELETE和REPLACE語句。
表:觸發器是屬於某一個表的:當在這個表上執行插入、更新或刪除操作的時候就導致觸發器的激活。我們不能給同一張表的同一個事件安排兩個觸發器,而且必須引用永久性表,不能將觸發程序與TEMPORARY表或視圖關聯起來。
觸發間隔:FOR EACH ROW通知觸發器每隔一行執行一次動作,而不是對整個表執行一次。
關於舊的和新創建的列的標識
在觸發器的SQL語句中,你可以關聯表中的任意列。但你不能僅使用列的名稱去標識,那會使系統混淆,因爲那裏可能會有列的新名(這可能正是你要修改的,你的動作可能正是要修改列名),還有列的舊名存在。因此你必須用這樣的語法來標識: "NEW . column_name"或者"OLD . column_name".這樣在技術上處理(NEW | OLD . column_name)新和舊的列名屬於創建了過渡變量("transition variables")。
對於INSERT語句,只有NEW是合法的;對於DELETE語句,只有OLD才合法;而UPDATE語句可以在和NEW以及OLD同時使用。下面是一個UPDATE中同時使用NEW和OLD的例子。
CREATE TRIGGER t21_au
BEFORE UPDATE ON t22
FOR EACH ROW
BEGIN
SET @old = OLD . s1;
SET @new = NEW.s1;
END;
觸發的SQL語句:是當觸發程序激活時執行的語句。如果你打算執行多個語句,可使用BEGIN ... END複合語句結構。這樣,就能使用存儲子程序中允許的相同語句。
刪除觸發器:
DROP TRIGGER [schema_name.]trigger_name
說明:
方案名稱(schema_name)是可選的。如果省略了schema(方案),將從當前方案中捨棄觸發程序。DROP TRIGGER語句需要SUPER權限。
查詢觸發器:
SHOW TRIGGERS [{FROM | IN} db_name]
[LIKE 'pattern' | WHERE expr]
mysql> SHOW TRIGGERS LIKE 'acc%'\G
*************************** 1. row ***************************
Trigger: ins_sum
Event: INSERT
Table: account
Statement: SET @sum = @sum + NEW.amount
Timing: BEFORE
Created: NULL
sql_mode:
Definer: myname@localhost
character_set_client: latin1
collation_connection: latin1_swedish_ci
Database Collation: latin1_swedish_ci
Trigger:The name of the trigger.
Event:The event that causes trigger activation: one of 'INSERT', 'UPDATE', or 'DELETE'.
Table :The table for which the trigger is defined.
Statement:The statement to be executed when the trigger is activated. This is the same as the text shown in the ACTION_STATEMENT column of INFORMATION_SCHEMA.TRIGGERS.
Timing:One of the two values 'BEFORE' or 'AFTER'.
Created:Currently, the value of this column is always NULL.
sql_mode:The SQL mode in effect when the trigger executes.
Definer:The account that created the trigger