【MySQL】视图和触发器

17 篇文章 0 订阅
9 篇文章 0 订阅

视图

视图其实就是虚拟的表(不是真实存在的),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户时只需要使用【名称】即可获取结果集,并可以将其当作表来使用。

select * from (select id,name,info.age from info) as t1 where age > 25
  • 创建视图
select * from (select id, name, info.age from info) as t1 where age > 25;
  • 删除视图
drop view v1;
  • 查看视图
select * from v1;
  • 修改视图
alter view v1 as select id,name,age from info where age > 30;

⚠️注意:基于视图只能查询,针对视图不能执行修改删除。如果源表发生表还,视图也会发生变化

触发器

使用触发器可以制定用户对表进行【增、删、改】,注意:没有查询

数据准备

-- 数据准备
-- 命令行代码
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')
);

-- 创建错误日志
create table errlog
(
    id       int primary key auto_increment,
    err_cmd  char(64),
    err_time datetime
);
  • 创建触发器
create trigger 触发器名 after insert on 表名 for each row   -- 在执行后触发
create trigger 触发器名 before insert on 表名 for each row  -- 执行前触发
-- 创建触发器
-- 更改结束符
delimiter //
create trigger tri_after_insert_cmd after insert on cmd for each row
    begin
        if NEW.success = 'no' then -- 等值判断只有一个等号
            insert into errlog(err_cmd, err_time) VALUES (NEW.cmd,new.sub_time);
        end if;
    end//
-- 更改结束符;
delimiter ;
  • 开始插入数据
insert into cmd(
    user, priv, cmd, sub_time, success)
values
    ('egon','0755','ls -l /etc',now(),'yes'),
    ('egon','0755','cat /etc/password',now(),'no'),
    ('egon','0755','useradd xxx',now(),'no'),
    ('egon','0755','ps aux',now(),'yes');
 
-- 插入数据后查询报错日志表
mysql> select * from errlog;
+----+-------------------+---------------------+
| id | err_cmd           | err_time            |
+----+-------------------+---------------------+
|  1 | cat /etc/password | 2024-09-25 11:00:48 |
|  2 | useradd xxx       | 2024-09-25 11:00:48 |
+----+-------------------+---------------------+
2 rows in set (0.00 sec)

-- 查询命令表,报错日志的中的数据命令表中也存在,说明是在插入后触发的触发器
mysql> select * from cmd;
+----+------+------+-------------------+---------------------+---------+
| id | user | priv | cmd               | sub_time            | success |
+----+------+------+-------------------+---------------------+---------+
|  1 | egon | 0755 | ls -l /etc        | 2024-09-25 11:00:48 | yes     |
|  2 | egon | 0755 | cat /etc/password | 2024-09-25 11:00:48 | no      |
|  3 | egon | 0755 | useradd xxx       | 2024-09-25 11:00:48 | no      |
|  4 | egon | 0755 | ps aux            | 2024-09-25 11:00:48 | yes     |
+----+------+------+-------------------+---------------------+---------+
4 rows in set (0.00 sec)
  • 执行之前触发触发器

delimiter //
create trigger tri_before_insert_cmd
    before insert
    on cmd
    for each row
begin
    if NEW.success='no' then
        insert into errlog(err_cmd, err_time) VALUES ('err',now());
    end if;
        end //
delimiter ;



insert into cmd(
    user, priv, cmd, sub_time, success)
values
    ('egon','0755','ls -l /etc',now(),'yes'),
    ('egon','0755','cat /etc/password',now(),'no'),
    ('egon','0755','useradd xxx',now(),'no'),
    ('egon','0755','ps aux',now(),'yes');	
  • 使用触发器

触发器无法由用户直接调用,而是由对表的【增/删/改】操作被动引发的

  • 删除触发器
drop trigger tri_after_insert_cmd;

特别的:NEW表示即将插入数据行,OLD表示即将删除的数据行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿龙的代码在报错

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值