排名前5的SQL悲剧中肯定有:
delete from table t /* where true */;
update t set col='new_value' /* where true */
由于漏掉where条件或者拼接SQL后的where条件部分为true,这时整个表都被删除/更新了...
在使用mysql的应用中,避免此类低级错误的方法:
1、应用仔细检查(小心才能使得万年船啊~)
2、开启sql_safe_updates
点击(此处)折叠或打开
- mysql> set global sql_safe_updates=1;
- Query OK, 0 rows affected (0.00 sec)
- mysql> delete from t;
- ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
- mysql> delete from t where 1=1;
- ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
本文根据mysql源码介绍一下sql_safe_updates的逻辑
sql_safe_update开启后,mysql server层在调用mysql_update/mysql_delete时对where和limit进行判断后决定是否执行,代码调用关系:
点击(此处)折叠或打开
- dispatch_command
- |->mysql_parse
- |->mysql_execute_command
- ->mysql_update/mysql_delete
mysql_update:(sql/sql_update.cc)
当where条件中column没有索引可用且无limit限制时会拒绝更新
当where条件中column没有索引可用且无limit限制时会拒绝更新
点击(此处)折叠或打开
- /* If running in safe sql mode, don't allow updates without keys */
- if (table->quick_keys.is_clear_all())
- {
- thd->server_status|=SERVER_QUERY_NO_INDEX_USED;
- if (safe_update && !using_limit)
- {
- my_message(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE,
- ER(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE), MYF(0));
- goto err;
- }
- }
当where条件为常量或者为空,或者where条件中column没有索引可用且无limit限制时拒绝删除
点击(此处)折叠或打开
- const_cond= (!conds || conds->const_item());
- safe_update=test(thd->variables.option_bits & OPTION_SAFE_UPDATES);
- if (safe_update && const_cond)
- {
- my_message(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE,
- ER(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE), MYF(0));
- DBUG_RETURN(TRUE);
- }
- ...
- /* If running in safe sql mode, don't allow updates without keys */
- if (table->quick_keys.is_clear_all())
- {
- thd->server_status|=SERVER_QUERY_NO_INDEX_USED;
- if (safe_update && !using_limit)
- {
- delete select;
- free_underlaid_joins(thd, select_lex);
- my_message(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE,
- ER(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE), MYF(0));
- DBUG_RETURN(TRUE);
- }
- }
点击(此处)折叠或打开
- mysql> update t set str='hello' where 1=1 limit 1;
- Query OK, 0 rows affected (0.00 sec)
- mysql> delete from t where 1=1 limit 1;
- ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
不过开启sql_safe_updates后,update和delete在修改数据时,如果不带limit,需要where条件可以走索引,否则会报错
相关推荐
主要给大家介绍了关于MySQL中参数sql_safe_updates在生产环境使用的相关资料,并给大家分享了解决mysql sql_safe_updates不支持子查询更新的方法,分享出来供大家参考学习,需要的朋友们下面来一起看看吧。
主要给大家介绍了关于mysql如何利用参数sql_safe_updates限制update/delete范围的相关资料文中介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
-U, –safe-updates Only allow UPDATE and DELETE that uses keys. 他的作用是防止执行delete的时候没带有条件语句,如果没加上where则语句不执行。 您可能感兴趣的文章:mysql之delete删除记录后数据库大小不变...
set global sql_safe_updates=0; 用户类型 管理员 admin 123456 模块介绍 管理员 登录模块 系统首页 账号管理 图像识别 文字分类 退出系统 数据库设计orcsystem Admin管理员表 id(主键) user(用户名) pwd(密码)...
set global sql_safe_updates=0; 用户类型 管理员 admin@admin.com 123456 医生 dwd@dd.com 123456 普通用户 12345678 123456 模块介绍 管理员(后台) 登录模块 系统首页 员工管理 科室管理 个人中心 用户...
set global sql_safe_updates=0; 用户类型 管理员 admin 123456 模块介绍 管理员 登录模块 系统首页 个股检索 (加载所有股票代码和股票名称到a标签, a标签点击启动爬虫获取最新的新闻信息, 并查询数据库中是否...
set global sql_safe_updates=0; VMware win10_en 测试机。 实时监控计算机日志,如果发生以下行为取证规则,系统将语音警告提示管理员,和网管,并记录行为入库。前端显示。 用户类型 管理员 admin 123456 模块...
set global sql_safe_updates=0; VMware win10_en 测试机。 实时监控计算机日志,如果发生以下行为取证规则,系统将语音警告提示管理员,和网管,并记录行为入库。前端显示。 用户类型 管理员 admin 123456 模块...
Interbase, MySQL 3.23(+), Oracle Server 7.2(+) with SQL*Net 2.2(+), Microsoft SQL Server, PostgreSQL 7.1(+), Sybase Adaptive Server Enterprise and Adaptive Server Anywhere (through Open Client, which...
快速高效用:SET SQL_SAFE_UPDATES = 0;下面的就不要看了! 今日用MySQL Workbench进行数据库的管理更新时,执行一个更新的语句碰到以下错误提示: 代码如下: Error Code: 1175 You are using safe update mode ...
thread safe BLOB-fields (including LOB and BFILE for Oracle8) stored procedure support (with mutiple result sets for IBM DB2, Microsoft and Sybase SQL Server) bi-directional and unidirectional result ...
;;;;;;;;... 1.... 2.... 3.... 4.... 5.... 6.... The syntax of the file is extremely simple.... Section headers (e.g.... at runtime.... There is no name validation.... (e.g.... previously set variable or directive (e.g....
-U, --i-am-a-dummy Synonym for option --safe-updates, -U. i-am-a-dummy FALSE 在mysql命令加上选项-U后,当发出没有WHERE或LIMIT关键字的UPDATE或DELETE时,mysql程序就会拒绝执行 2、指定-U登录测试 #