• MYSQL复习笔记13-触发器trigger


    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即可迁移

  • 相关阅读:
    双反斜杠引发的正则表达式错误
    表单验证的前端验证后端验证
    html中的select下拉框
    hibernate需要注意的点
    星空雅梦
    星空雅梦
    星空雅梦
    星空雅梦
    星空雅梦
    星空雅梦
  • 原文地址:https://www.cnblogs.com/diege/p/3583533.html
Copyright © 2020-2023  润新知