在日常的数据库开发和运维中,数据安全永远是头等大事。
MySQL 提供的 sql_safe_updates(安全更新模式)
正是为了防止因误操作而引发的灾难性数据更改。
启用该模式后,如果执行的 UPDATE 或 DELETE 语句缺少 WHERE 条件或没有使用索引限制,MySQL 将拒绝执行操作,从而有效避免全表更新或删除的风险。
假设你是一位 Java 研发工程师,在开发过程中需要频繁修改测试数据。有一次,你意外地将 UPDATE 语句写错,少了关键的 WHERE 条件,如果没有启用 sql_safe_updates,可能会导致整个表数据被修改。为此,你可以通过在会话中设置 SET sql_safe_updates=1;
来激活安全更新模式,防止这种低级错误发生。
为了方便管理,不希望每次登录都手动设置,你可以利用 MySQL 的 init_connect
变量,让非超级用户在登录时自动执行安全设置。例如,创建一个存储过程,根据用户名判断是否启用 sql_safe_updates:
DELIMITER $$
CREATE PROCEDURE set_safe_updates_if_needed()
BEGIN
-- 假设研发用户的用户名列表为 'rd','rd2'
IF (SUBSTRING_INDEX(USER(), '@', 1) IN ('rd','rd2')) THEN
SET sql_safe_updates = 1;
END IF;
END$$
DELIMITER ;
然后将 init_connect
设置为普通用户登录后,自动调用这个存储过程:
SET GLOBAL init_connect = 'CALL set_safe_updates_if_needed()';
当研发(rd)用户登录 MySQL 后,如果执行 UPDATE t1 SET cid=33;
这样的 SQL 语句,或者 WHERE
条件中使用的字段没有索引,就会触发错误:
mysql> desc t1;
+-------+------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| cid | int | YES | | NULL | |
+-------+------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> update t1 set cid=33 where cid=3;
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
(安全更新模式)已开启,MySQL 会限制执行可能影响大量数据的 UPDATE
或 DELETE
语句,防止误操作导致全表数据被意外修改或删除。
这一机制对于开发环境尤其重要,能有效减少因 SQL 语句疏忽导致的灾难性后果。
init_connect
语句,因为 MySQL 默认认为超级用户具备足够的权限去控制会话。@@sql_safe_updates
仍为 0,请检查当前用户是否拥有 SUPER 权限。建议在测试或开发环境中使用权限较低的用户来确保安全机制生效。通过这种方式,你可以在不影响 DBA 用户灵活操作的前提下,为研发用户提供额外的数据安全保障,避免因操作失误引发大规模数据错误。
mysql> show grants for rd@'%';
+-------------------------------------------------------------------------------+
| Grants for rd@% |
+-------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'rd'@'%' |
| GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `test`.* TO 'rd'@'%' |
+-------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。