【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表示即将删除的数据行