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

 

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