7 视图、触发器


一、视图(view):

1 什么是视图

视图就是通过查询得到一张虚拟表,然后保存下来,下次可以直接使用

其实视图也是表

2 为什么要用视图

如果要频繁的操作一张虚拟表(拼表组成的),你就可以制作成视图 后续直接操作

3 如何操作

# 固定语法

create view 表名 as 虚拟表的查询sql语句

# 具体操作

create view teacher2course as
select * from teacher INNER JOIN course
on teacher.tid = course.teacher_id
;

 

drop view teacher2course;
# 视图使用频率不高

 

 

 4 注意

  • 创建视图在硬盘上只会有表结构 没有表数据(数据还是来自于之前的表)
  • 视图一般只用来查询 里面的数据不要继续修改 可能会影响真正的表
  • 视图到底使用频率高不高呢?

      • 不高
      • 当你创建了很多视图之后 会造成表的不好维护

    二、触发器trigger(满足特定条件之后自动执行)

  • 在满足对表数据进行增、删、改的情况下,自动触发的功能

    使用触发器可以帮助我们实现监控、日志...

    触发器可以在六种情况下自动触发 增前 增后 删前删后 改前改后

   1 基本语法结构

create trigger 触发器的名字 before/after insert/update/delete on 表名 for each row
begin
    sql语句
end

2 具体使用 针对触发器的名字 我们通常需要做到见名知意

 

触发器名字在命名的时候推荐使用下列的方式
    tri_after_insert_t1、tri_before_delete_t1

 

针对增

 

# 增前
create trigger tri_before_insert_t1  before insert on t1
for each row
begin
    sql语句
end

# 增后
create trigger tri_after_insert_t1  after insert on t1
for each row
begin
    sql语句
end

 

"""针对删除和修改 书写格式一致"""

# 如何临时修改SQL语句的结束符

delimiter $$

# 在MySQL中NEW特指数据对象可以通过点的方式获取字段对应的数据

id  name   pwd  hobby
1   jason  123  read
NEW.name >>> jason

 

ps:

修改MySQL默认的语句结束符 只作用于当前窗口

delimiter $$ 将默认的结束符号由;改为$$

delimiter ;

3.案例

CREATE TABLE cmd (
    id INT PRIMARY KEY auto_increment,
    USER CHAR (32),
    priv CHAR (10),
    cmd CHAR (64),
    sub_time datetime, #提交时间
    success enum ('yes', 'no') #0代表执行失败
);

CREATE TABLE errlog (
    id INT PRIMARY KEY auto_increment,
    err_cmd CHAR (64),
    err_time datetime
);

delimiter $$  # 将mysql默认的结束符由;换成$$
create trigger tri_after_insert_cmd after insert on cmd for each row
begin
    if NEW.success = 'no' then  # 新记录都会被MySQL封装成NEW对象
        insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);
    end if;
end $$
delimiter ;  # 结束之后记得再改回来,不然后面结束符就都是$$了

 

 

当cmd表中的记录succes字段是no那么就触发触发器的执行去errlog表中插入数据

NEW指代的就是一条条数据对象

#往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志

INSERT INTO cmd (
    USER,
    priv,
    cmd,
    sub_time,
    success
)
VALUES
    ('tony','0755','ls -l /etc',NOW(),'yes'),
    ('tony','0755','cat /etc/passwd',NOW(),'no'),
    ('tony','0755','useradd xxx',NOW(),'no'),
    ('tony','0755','ps aux',NOW(),'yes');

表中sussess字段是no那么就触发触发器的执行去errlog表中插入数据

 

 

# 查询errlog表记录
select * from errlog;
# 查看触发器
show triggers;
# 删除触发器
drop trigger tri_after_insert_cmd;

 

相关