排名前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`是一个非常重要的系统变量,它主要用于保护数据库免受潜在的破坏性更新或删除操作。这个参数默认情况下是关闭的,但强烈建议在生产环境中开启,以增加数据安全性。当`sql_safe_...
MySQL中的`sql_safe_updates`参数是一个非常实用的配置选项,用于增强数据库的安全性,防止由于错误的UPDATE或DELETE语句导致的数据丢失。该参数的主要作用是限制用户在没有明确WHERE子句或者WHERE子句不能有效定位...
* sql_safe_updates * sql_select_limit * timestamp * tmp_table_size * updatable_views_with_limit * unique_checks * windowing_use_high_precision 这些变量大多数与 SQL 查询相关,可以在查询语句中进行修改...
set global sql_safe_updates=0; 用户类型 管理员 admin 123456 模块介绍 管理员 登录模块 系统首页 账号管理 图像识别 文字分类 退出系统 数据库设计orcsystem Admin管理员表 id(主键) user(用户名) pwd(密码)...
-U, –safe-updates Only allow UPDATE and DELETE that uses keys. 他的作用是防止执行delete的时候没带有条件语句,如果没加上where则语句不执行。 您可能感兴趣的文章:mysql之delete删除记录后数据库大小不变...
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 ...
./mysqld_safe --user=mysql & ``` 连接MySQL并用临时密码登录: ```bash mysql -u root -p ``` 输入临时密码后,更改root用户的密码: ```sql ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_new_password...
如果你需要允许远程访问MySQL服务器,可以使用以下SQL语句,将所有本地主机('localhost')上的root权限复制到所有主机('%'): ```sql INSERT INTO user (Host,User,Password,Select_priv,Insert_priv,Update_priv...
set global sql_safe_updates=0; 用户类型 管理员 admin 123456 模块介绍 管理员 登录模块 系统首页 账号管理 图像识别 手写识别 (KNN) 文字分类 退出系统 数据库设计orcsystem Admin管理员表
set global sql_safe_updates=0; 用户类型 管理员 admin 123456 模块介绍 管理员 登录模块 系统首页 账号管理 图像识别 手写识别 (KNN) 文字分类 退出系统 数据库设计orcsystem Admin管理员表
接着,为了方便后续的数据修改,设置了`SQL_SAFE_UPDATES=0;`这一步骤通常是为了允许对数据进行非安全更新,因为在默认情况下,MySQL不允许直接修改数据而不先锁定表。 接下来,实验中构建了三个关键的表:`student...
- 启动MySQL服务:`bin/mysqld_safe --user=mysql` 或者 `/etc/init.d/mysqld start` - 登录MySQL客户端:`mysql` 4. MySQL 5.6性能参数配置: - innodb_buffer_pool_size:设置InnoDB缓冲池的大小,建议为...
/usr/local/MySQL/bin/MySQLd_safe --user=mysql & ``` 接着,配置从服务器(Slave)。在从服务器的`my.cnf`中,将`server-id`设置为2,并添加用于连接主服务器的相关参数: ```ini server-id = 2 master-host = ...