触发器实例,Mysql那些事儿之

+—-+———+—————–+  

txt text,  

 

更新一条数据:

触发器代码:

  1. 用于审计的触发器过程
    这个例子触发器保证了在emp表上的任何插入、更新或删除一行的动作都被记录(即审计)在emp_audit表中。当前时间和用户名以及在其上执行的操作类型都会被记录到行中。

    –创建测试表
    create table emp (
    empname text not null,
    salary integer
    );

    –创建审计表
    create table emp_audit(
    operation char(1) not null,
    stamp timestamp not null,
    userid text not null,
    empname text not null,
    salary integer
    );

    –创建触发器函数
    create or replace function process_emp_audit() returns trigger as $emp_audit$
    begin

    if (TG_OP = 'DELETE') then
      insert into emp_audit select 'D',now(),user,old.*;
      return old;
    elsif (TG_OP = 'UPDATE') then
      insert into emp_audit select 'U',now(),user,new.*;
      return new;
    elsif (TG_OP = 'INSERT') then
      insert into emp_audit select 'I',now(),user,new.*;
      return new;
    end if;
    return null;
    

    end;
    $emp_audit$ language plpgsql;

    –创建触发器
    create trigger emp_audit
    after insert or update or delete on emp
    for each row execute procedure process_emp_audit();

    –测试触发器
    test=# insert into emp values (‘John’,1200);
    INSERT 0 1
    test=# select * from emp_audit;
    operation | stamp | userid | empname | salary
    ———–+—————————-+———-+———+——–
    I | 2017-08-09 18:18:10.189772 | postgres | John | 1200
    (1 row)

before insert –触发器的时间和事件  

--创建测试表
CREATE TABLE emp (
    empname text,
    salary integer,
    last_date timestamp,
    last_user text
);

--创建触发器函数
CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
    BEGIN
        -- 检查 empname 以及 salary
        IF NEW.empname IS NULL THEN
            RAISE EXCEPTION 'empname cannot be null';
        END IF;
        IF NEW.salary IS NULL THEN
            RAISE EXCEPTION '% cannot have null salary', NEW.empname;
        END IF;

        -- 谁会倒贴钱为我们工作?
        IF NEW.salary < 0 THEN
            RAISE EXCEPTION '% cannot have a negative salary', NEW.empname;
        END IF;

        -- 记住谁在什么时候改变了工资单
        NEW.last_date := current_timestamp;
        NEW.last_user := current_user;
        RETURN NEW;
    END;
$emp_stamp$ LANGUAGE plpgsql;

--创建触发器
CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE PROCEDURE emp_stamp();

--测试触发器
test=# insert into emp values ('John');  --salary为空,触发器报错
ERROR:  John cannot have null salary
CONTEXT:  PL/pgSQL function emp_stamp() line 7 at RAISE

test=# insert into emp values (null,1200);   --empname为空,触发器报错
ERROR:  empname cannot be null
CONTEXT:  PL/pgSQL function emp_stamp() line 4 at RAISE

test=# insert into emp values ('John',-200); --salary为负数,触发器报错
ERROR:  John cannot have a negative salary
CONTEXT:  PL/pgSQL function emp_stamp() line 10 at RAISE

test=# insert into emp values ('Bob',1200);  --成功插入正常数据,并记录了最后操作时间和操作用户
INSERT 0 1
test=# select * from emp;
 empname | salary |         last_date          | last_user 
---------+--------+----------------------------+-----------
 Bob     |   1200 | 2017-08-09 17:39:23.671957 | postgres
(1 row)

 

2017-08-17

+—-+———+—————–+  

Mysql那些事儿之(二)有关数据库的操作

1.
创建一个触发器,表中的行在任何时候被插入或更新时,当前用户名和时间也会被标记在该行中。并且它会检查雇员的姓名以及薪水。

 结果如下:  

for each row  

The
End!

| 13 | sunny   | after update    |  

 

create trigger upd_film_bef  

for each row                      –说明触发器为行级触发器  

for each row  –行级触发器  

txt text,  

Mysql那些事儿之(二)有关数据库的操作

我们来看一下触发器的语法结构:

begin  

现在可以按照触发器的语法结构来写触发器了。

update film set name=’sunny’ where id=1;  

   –触发器要执行的逻辑  

;

);  

mysql从5.0.2版本开始支持触发器的功能。

txt text,  

相关链接:
Mysql那些事儿之(一)mysql的安装

Mysql那些事儿之(二)有关数…

针对表film 创建 before update触发器

Sql代码  

| 11 | sunny   | after insert    |  

name varchar(40),  

Sql代码  

Mysql那些事儿之(一)mysql的安装

   www.2cto.com  

Mysql那些事儿之(七)深入select查询

业务规则是 在向film表插入数据时,同时向日志表film_text中也插入一条数据.

查询表film_text:

建立film表:

end;  

 

对于film表在 触发器 一 里有提过,代码就不写了。

相关链接:

 

Mysql那些事儿之(九)常用的函数

 

 

Sql代码  

   www.2cto.com  

针对表film 创建 after update触发器

begin  

insert into film values(null,’sunny’,’i like you’,null);  

Sql代码  

  

 

begin  

建立数据库:

 

id smallint unsigned not null auto_increment,  

on film   

   www.2cto.com  

create database db_test;  

Mysql那些事儿之(五)操作时间

   trigger_stmt  

可以做下实验:

在这儿写一个简单的触发器示例:

–创建表  

Sql代码  

Sql代码  

 

end;  

primary key(id)  

| id | name    | txt             |  

begin  

比较after insert、before insert、after update、before
update触发时间与事件 的触发情况。

name varchar(40),  

|  9 | huigui0 | thank you…… |  

trigger_event是说明触发器的事件,比如delete、update、insert;

before update on film  

举例:

Sql代码  

Mysql那些事儿之(六)字符串模式匹配

end;  

  insert into film_text(id,name,txt) values(new.id,new.name,new.txt);  

after insert –触发器的时间和事件  

create trigger trigger_name trigger_time trigger_event  

   www.2cto.com  

Mysql那些事儿之(十)触发器一

Mysql那些事儿之(五)操作时间

针对表film 创建 after insert 触发器:

 

Mysql那些事儿之(十一)触发器二

Mysql那些事儿之(四)数据表数据查询操作

 

   www.2cto.com  

create trigger upd_film_aft  –触发器名称为upd_film_aft    

;

Mysql那些事儿之(三)有关数据表的操作

on table_name  

   insert into film_text values(null,’sunny’,’after insert’);  

end;  

insert into film_text values(null,’sunny’,’before update’);  

create table film_text(  

–创建after update 触发器  

Sql代码  

5 rows in set  

触发器是什么?触发器就是与表有关的数据库对象,在满足定义的条件时触发,并且执行触发器中定义的语句。

相关链接:
Mysql那些事儿之(一)mysql的安装

Mysql那些事儿之(二)有关数…

 

Mysql那些事儿之(四)数据表数据查询操作

 

create trigger trigger_film_aft  –触发器名称为trigger_film_aft  

Mysql那些事儿之(七)深入select查询

;

Sql代码  

| 12 | sunny   | before update   |  

trigger_name是说明触发器的名称;

 

create trigger trigger_film  –trigger_film为触发器的名称  

begin  

  www.2cto.com  

 

 

;

create table film(  

Mysql那些事儿之(六)字符串模式匹配

+—-+———+—————–+  

on film                                –建立触发器的表名  

id smallint auto_increment,  

Mysql那些事儿之(一)mysql的安装

到现在四个触发器创建完了。

当然还得建立film_text表:

after update –触发器的时间和事件  

;

 

 

Mysql那些事儿之(九)常用的函数

id smallint unsigned not null,  

 

after                                   –after为触发器要发生的时间  

Mysql那些事儿之(八)索引

;

Sql代码  

mysql> select * from film_text;  

Mysql那些事儿之(八)索引

Sql代码  

);  

 

 

Sql代码  

运行完这个触发器之后,当在另一个film表里插入数据后,film_text里也将增加一条数据。

trigger_time是说明触发器的时间,after、before;

end;  

插入一条数据

trigger_stmt是说明触发器要执行的事物语句,也就是你要干什么的东西,写在这里。

针对表film 创建before insert 触发器:

insert                                 –insert为触发器发生时的条件
 插入操作  

Sql代码  

Mysql那些事儿之(三)有关数据表的操作

 

primary key(id)  

+—-+———+—————–+  

 说明了 before与after的顺序。

for each row  –行级触发器  

name varchar(40),  

   insert into film_text values(null,’sunny’,’before insert’);  

for each row  

begin  

 

–创建before update触发器  

select * from film_text;  

Mysql那些事儿之(十)触发器一

–创建before insert 触发器  

   insert into film_text values(null,’sunny’,’after update’);  

create trigger trigger_film_bef  –触发器名称为trigger_film_bef   

end;  

3 rows in set  

   www.2cto.com  

   www.2cto.com  

Sql代码  

| 10 | sunny   | before insert   |  

);  

on film   

create table film_text(  

结果如下:

primary key(id)  

on film   

Sql代码  

–创建after insert 触发器  

Sql代码  

for each row  –行级触发器  

相关链接:

 

 说明了 before与after的顺序。