当前位置: 首页 > article >正文

【MySQL】视图和触发器

视图

视图其实就是虚拟的表(不是真实存在的),其本质是【根据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表示即将删除的数据行


http://www.kler.cn/a/327092.html

相关文章:

  • LeNet网络搭建
  • Element-plus表格使用总结
  • .NET Core 中使用 C# 获取Windows 和 Linux 环境兼容路径合并
  • 维克日记:私密写作新选择,轻松记录生活点滴
  • 如何利用Python爬虫获得1688按关键字搜索商品
  • 中地数码亮相2024武汉市数字经济应用场景对接大会
  • 使用代理爬取数据需要筛选合适的ip吗
  • C++11 多线程编程-小白零基础到手撕线程池
  • 【VUE】案例:商场会员管理系统
  • find()和findIndex()方法
  • 微信小程序——音乐播放器
  • 【有啥问啥】二分图(Bipartite Graph)算法原理详解
  • SpringMVC源码-AbstractUrlHandlerMapping处理器映射器将实现Controller接口的方式定义的路径存储进去
  • 健康生活,从日常细节开始
  • NVLM多模态 LLM 在图像和语言任务中的表现优于 GPT-4o
  • Oracle数据恢复—异常断电导致Oracle数据库报错的数据恢复案例
  • 第167天:应急响应-日志自动提取分析项目_ELK_Logkit_LogonTracer_Anolog等
  • Mysql高级篇(下)——日志
  • Microsoft Edge 五个好用的插件
  • MySQL存储过程循环操作
  • LVGL 笔记
  • SpringBoot3+Swagger3(最新版springdoc-openapi教程)
  • 组合优化与凸优化 学习笔记5 对偶拉格朗日函数
  • 21 vue3之发布npm插件(hook自定义指令)
  • 国产RISC-V案例分享,基于全志T113-i异构多核平台!
  • 【刷题6】一维前缀和、二维前缀和