暂无图片
暂无图片
11
暂无图片
暂无图片
6
暂无图片

小心这种写法真会删库跑路,你的工资怕不够赔!!!(一)

原创 aisql 2024-08-29
559

1、问题发现

今天收到一朋友反馈,发现执行一个存储过程后,整个表数据都没有了。
我让朋友把存储过程发过来我查一下,结果存储过程好长好几百行,短时间没有发现原因,结果朋友自己从阿里的审计日志发现了问题。

2、问现复现

做一个极简例子即可复现此问题

--构造测试数据 创建一个表,并插入5行 create table t (id int); insert into t values(1),(3),(4),(5),(6);
复制

此时查询t表 有5行记录
image.png

编写存储过程 根据参数删除其中一行记录

drop procedure if exists sp1 ; delimiter ;; CREATE PROCEDURE sp1 (id bigint) BEGIN SET @id = id; delete from t where id = @id ; END ;; delimiter ;
复制

调用存储过程 删除指id = 1 的那一行

call sp1(1);
复制

执行后 再查询,发现t表为空了
image.png

看到这里的朋友发现问题在哪里了吗?

3、分析问题

想弄明白为什么会这样,我就想那看存储过程内的语句变成什么样了就知道了

a、第一种方法 查看全量日志
set global general_log=1; show variables like '%general_log%';
复制

发现全量日志中记载的是 call sp(1) 这个语句
image.png

b、第二种方法 查看慢日志

在delete 后 加一个sleep 构造慢SQL

set global slow_query_log=on; show variables like 'slow_query_log_file';
复制

发现慢日志中记载的也是 call sp(1) 这个语句

c、第三种方法 查看binlog日志
SET SESSION binlog_format = 'STATEMENT'; show master status; show binlog events in 'LAPTOP-MT6UTC5I-bin.000072';
复制

1724933995598.jpg

至此真相大白了。原来where 1=1 永远为真了。

4、分析根因

存储过程或函数内的变量优先级最高,当和表的列名冲突时,会优先认为是局部变量

以前写过一篇MySQL变量的文章 有兴趣的可以点这传送

最后修改时间:2024-10-14 17:45:28
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

黄铎彦
暂无图片
4月前
评论
暂无图片 0
4月前
暂无图片 点赞
评论
黄滔
暂无图片
5月前
评论
暂无图片 0
小心这种写法真会删库跑路
5月前
暂无图片 点赞
评论
星星之火
暂无图片
6月前
评论
暂无图片 0
一个人的孤独不是孤独,一个人找另一个人,一句话找另一句话,才是真正的孤独。
6月前
暂无图片 点赞
评论
筱悦星辰
暂无图片
6月前
评论
暂无图片 0
正确地管理精力与时间,学会适时休息,是一种智慧。
6月前
暂无图片 点赞
评论
鲁鲁
暂无图片
6月前
评论
暂无图片 0
小心这种写法真会删库跑路,你的工资怕不够赔!!!
6月前
暂无图片 点赞
评论
雪狼sunny
暂无图片
6月前
评论
暂无图片 0
小心这种写法真会删库跑路,你的工资怕不够赔!!!
6月前
暂无图片 点赞
评论