Date: 20140305
Auth: Jin
一、概念
1、基本概念
触发器是一个被指定关联到一个表的数据对象,触发器是不需要调用的,当对一个表的特别事件出现时,它就被激活。
触发器的代码也是由SQL语句组成的,因此用在存储过程中的语句也可以用在触发器的定义中。
触发器是一类特殊的存储过程。
2、类型
SQL2008中分为:DML和DDL触发器
1)DML触发器
当数据库发生DML事件时将调用DML触发器。INSERT,UPDATE,DELETE
2)DDL触发器
当数据库发生DDL事件时将调用DDL触发器。CREATE,ALTER,DROP
二、SQL2008
1、创建DML触发器
CREATE TRIGGER trigger_name
ON
table|view
[WITH ENCRYPTION]
{FOR|AFTER|INSTEAD
OF}
{[INSERT|UPDATE|DELETE]}
[WITH APPEND]
[NOT FOR
REPLICTION]
AS {SQL
}
简单说明
ON table|view:指定在其上执行触发器的表或视图
AFTER
用于说明触发器在指定操作都成功执行后触发,比如AFTER INSERT
表示向表中插入数据时激活触发器
INSTEAD OF
:指定使用DML触发器中的操作代替触发语句的操作。
实例1
create table table1(a int);
CREATE TRIGGER table1_insert
ON
table1 AFTER INSERT
AS
BEGIN
DECLARE @str char(50)
SET
@str=‘TRIGGER IS WORKING‘
PRINT @str
END
实例2
当向CJB中插入一个学生的成绩时,讲XSB表中该学生的总学分加 上添加的课程学分
CREATE TRIGGER
cjb_insert
ON CJB AFTER INSERT
AS
BEGIN
DECLARE @num
char(6),@kc_num char(3)
DECLARE @xf int
select @num=学号,@kc_num=课程号
from inserted
select @xf=学分 FROM KCB where 课程号=@kc_num
UPDATE XSB
SET 总学分=总学分+@xf WHERE 学号=@num
PRINT ‘修改成功’
END
SET
@str=‘TRIGGER IS WORKING‘
PRINT @str
在UPDATE之后触发
ON CJB AFTER
UPDATE
在DELETE之后触发
ON CJB AFTER DELETE
2、创建DDL触发器
CREATE TRIGGER trigger_name
ON {ALL SERVER|DATABASE
}
[WITH ENCRYPTION]
{FOR|AFTER} {event_type|event_group}
AS
{SQL
}
三、MYSQL方式
参考:
http://www.cnblogs.com/hitwtx/archive/2011/07/25/2116014.html
1.创建表:
create
table t(s1 integer);
2.创建触发器:
delimiter |
create trigger t_trigger before insert on t for
each row
begin set @x = "hello trigger";
set NEW.s1 = 55;
end;
|
delimiter ;
3 查看触发器
SELECT * FROM information_schema.`TRIGGERS`\G
*************************** 1. row ***************************
TRIGGER_CATALOG: NULL
TRIGGER_SCHEMA: dbtest
TRIGGER_NAME: t_trigger
EVENT_MANIPULATION: INSERT
EVENT_OBJECT_CATALOG: NULL
EVENT_OBJECT_SCHEMA: dbtest
EVENT_OBJECT_TABLE: t
ACTION_ORDER: 0
ACTION_CONDITION: NULL
ACTION_STATEMENT: begin set @x = "hello
trigger";
set NEW.s1 = 55;
end
ACTION_ORIENTATION: ROW
ACTION_TIMING: BEFORE
ACTION_REFERENCE_OLD_TABLE:
NULL
ACTION_REFERENCE_NEW_TABLE: NULL
ACTION_REFERENCE_OLD_ROW: OLD
ACTION_REFERENCE_NEW_ROW: NEW
CREATED: NULL
SQL_MODE:
DEFINER: root@localhost
CHARACTER_SET_CLIENT: latin1
COLLATION_CONNECTION:
latin1_swedish_ci
DATABASE_COLLATION: utf8_general_ci
1 row in set
(0.01 sec)
4. 如果触发器创建错误,可能只能删除了,至少我试过不能replace
drop trigger t_trigger;
5. 当执行insert 时:
insert into t values(1);
6. 会执行触发器t_trigger
select @x,t.* from t;
7. 可以看到结果:
+---------------+------+
| @x | s1
|
+---------------+------+
| hello trigger | 55
|
+---------------+------+
四、记忆
1.查看触发器
SELECT * FROM information_schema.`TRIGGERS`\G
SELECT * FROM
information_schema.`TRIGGERS` where TRIGGER_NAME=‘t_trigger‘\G
2.删除,不能replace
drop trigger t_trigger;
3.CRATE TRIGGER
create table t(s1 integer);
delimiter |
CRATE
TRIGGER t_trigger before insert ON t for each row
BEGIN set @x = "hello
trigger";
set NEW.s1 = 55;
END;
|
delimiter ;
4.迁移
为每个转储的表转储触发器。该选项默认启用;用--skip-triggers禁用它。
实际上dump出来 被注释掉了
触发器也是特殊的存储过程,所以迁移时使用存储过程的方法-R即可迁移