MYSQL數據庫的觸發器(trigger)

(3)觸發器(trigger

它是個特殊的存儲過程,它的執行不是由程序調用,也不是手工啓動,而是由事件來觸發,比如當對一個表進行操作( insertdelete update)時就會激活它執行。觸發器經常用於加強數據的完整性約束和業務規則等。觸發器可以從 DBA_TRIGGERS USER_TRIGGERS 數據字典中查到。

爲什麼要使用觸發器:

ü  可以使用它來檢查或預防壞的數據進入數據庫。

ü  可以改變或取消INSERTUPDATE、以及DELETE語句。

ü  可以在一個會話中監視數據改變的動作。

創建觸發器:精華志京華志畢業設計輔導諮詢 [email protected]

 

CREATE [DEFINER = { user | CURRENT_USER }]

 TRIGGER <觸發器名稱>

{ BEFORE | AFTER }

{ INSERT | UPDATE | DELETE }

ON <表名稱>

FOR EACH ROW

<觸發的SQL語句>

       說明:

DEFINERThe 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:將新行插入表時激活觸發程序,例如,通過INSERTLOAD DATAREPLACE語句。

ü  UPDATE:更改某一行時激活觸發程序,例如,通過UPDATE語句。

ü  DELETE:從表中刪除某一行時激活觸發程序,例如,通過DELETEREPLACE語句。

:觸發器是屬於某一個表的:當在這個表上執行插入、更新或刪除操作的時候就導致觸發器的激活。我們不能給同一張表的同一個事件安排兩個觸發器,而且必須引用永久性表,不能將觸發程序與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中同時使用NEWOLD的例子。

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

  • TriggerThe name of the trigger.

  • EventThe event that causes trigger activation: one of 'INSERT', 'UPDATE', or 'DELETE'.

  • Table The table for which the trigger is defined.

  • StatementThe 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.

  • TimingOne of the two values 'BEFORE' or 'AFTER'.

  • CreatedCurrently, the value of this column is always NULL.

  • sql_modeThe SQL mode in effect when the trigger executes.

  • DefinerThe account that created the trigger

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章