mysql 内置功能 触发器 实验
2024-08-29 16:32:25
#准备表
命令表
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代表执行失败
);
priv 字段是权限
sucess enum 是命令执行成功与否
另外一张命令错误表 记录命令出错信息
err_cmd 命令命
err_time 命令的提交时间
CREATE TABLE errlog (
id INT PRIMARY KEY auto_increment,
err_cmd CHAR (64),
err_time datetime
);
这两张表都有关系的
插入记录到cmd表 如果插入的命令记录有错误 这条错误的记录会插入到errlog表里
在插入完之后做触发器,判断这条命令是否错误 插完之后sueess字段如果为no,意味着这条命令记录是错误的,就把错误记录写入到,
errlog表里
#创建触发器
触发器提供两个对象 1.NEW 代表新增进来的记录 2. old 代表之前老的记录 insert 都是新的记录 都用new对象
alter 是用到老记录和新纪录 所以修改时候涉及用到old、new对象 new对象下面有相应的属性 new.id 就是调新建记录的id new.user 调新增记录的user
new.success
delimiter // # 设置mysql结束语句符号为//
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) ; #必须加分号,这里加;也不会中断mysql语句
END IF ; #必须加分号
END// # 结束触发器语句
delimiter ; # 把mysql 结束语句符号 还原为;
上面的中间代码的语法类似于shell
判断这个new.success字段新增进来的记录是否为no 如果为no执行then 下面的代码
if new.success ='no' then
执行的代码
end if ; 结束语句
mysql 结束语句符号都是;
delimiter 作用是声明sql语句的结束符号 用任意符号都可以
delimiter // 声明mysql结束语句符号 用// 不用;
#往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志
INSERT INTO cmd (
USER,
priv,
cmd,
sub_time,
success
)
VALUES
('egon','','ls -l /etc',NOW(),'yes'),
('egon','','cat /etc/passwd',NOW(),'no'),
('egon','','useradd xxx',NOW(),'no'),
('egon','','ps aux',NOW(),'yes'); 插入后触发触发器
#查询错误日志,发现有两条
mysql> select * from errlog;
+----+-----------------+---------------------+
| id | err_cmd | err_time |
+----+-----------------+---------------------+
| 1 | cat /etc/passwd | 2018-11-12 05:28:46 |
| 2 | useradd xxx | 2018-11-12 05:28:46 |
+----+-----------------+---------------------+
2 rows in set (0.00 sec)
最新文章
- j2ee学习资料收集
- 一个input标签搞定含内外描边及阴影的按钮~
- Unknown class in Interface Builder file 解决方案
- 【转】Spring Quartz的原理
- PHP 设计模式 笔记与总结(11)观察者模式
- devexpress13学习系列(四)PDFViewer(4)
- Ext vtype
- Ajax-jQuery实现
- UM_第三方登录
- 【HDU 3483】 A Very Simple Problem (二项式展开+矩阵加速)
- 【hanoi】hanoi移动次数和移动步骤
- 免费开源的boostrap模板
- vue-router的两种模式的区别
- SSH反向连接及Autossh
- Mysql利用存储过程插入400W条数据
- GIL全局解释器锁
- Scrapy实现腾讯招聘网信息爬取【Python】
- Microsoft SQL Server 17导出xlsx文件时报错:The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine. (System.Data)
- 【HDOJ1531】【差分约束+添加超级源点】
- Github上关于iOS的各种开源项目集合2(强烈建议大家收藏,查看,总有一款你需要)
热门文章
- Xshell 5 免费版本安装过程
- .net写入文本到本地
- 【Linux基础学习】Ubuntu 常用命令大全
- 【mac】php7.1 安装swoole 扩展
- css3整理--text-overflow
- JUnit(>;4.0)@BeforeClass、@Before、@Test、@After、@AfterClass、@Ignore
- C语言程序设计--宏和预处理
- H3C系列之三层交换机文件管理
- 在eclipse中编辑linux上的项目
- ";will you marry me"; vs ";would you marry me";