开发者社区 问答 正文

高危类 SQL 自动保护是什么?

为了防止误操作,DRDS 默认禁止全表删除和全表更新的操作。

下列语句默认会被禁止:

DELETE 语句不带 WHERE 条件或者 LIMIT 条件;
UPDATE 语句不带 WHERE 条件或者 LIMIT 条件。
如果确实需要执行这类操作,可以通过 HINT 来临时跳过这个限制:HINT:/!TDDL:FORBID_EXECUTE_DML_ALL=false*/

示例

执行全表删除默认会被拦截:

mysql> delete from tt;
ERR-CODE: [TDDL-4620][ERR_FORBID_EXECUTE_DML_ALL] Forbid execute DELETE ALL or UPDATE ALL sql. More: [http://middleware.alibaba-inc.com/faq/faqByFaqCode.html?faqCode=TDDL-4620]
加 HINT 则可执行成功:

mysql> /!TDDL:FORBID_EXECUTE_DML_ALL=false*/delete from tt;
Query OK, 10 row affected (0.21 sec)
执行全表更新默认会被拦截:

mysql> update tt set id = 1;
ERR-CODE: [TDDL-4620][ERR_FORBID_EXECUTE_DML_ALL] Forbid execute DELETE ALL or UPDATE ALL sql. More: [http://middleware.alibaba-inc.com/faq/faqByFaqCode.html?faqCode=TDDL-4620]
加 HINT 则可执行成功:

mysql> /*TDDL:FORBID_EXECUTE_DML_ALL=false*/update tt set id = 1;
Query OK, 10 row affected (0.21 sec)
DELETE 或者 UPDATE 语句中带有 WHERE 或者 LIMIT 条件,不会出现这个限制。

mysql> delete from tt where id = 1;
Query OK, 1 row affected (0.21 sec)

展开
收起
猫饭先生 2017-10-30 13:53:37 2902 分享 版权
阿里云 AI 助理回答

您描述的情况是正确的。阿里云分布式关系型数据库服务(DRDS)为了保护用户数据安全,避免因误操作导致的数据大量丢失或更改,确实默认禁止了全表删除(DELETE without WHERE or LIMIT)和全表更新(UPDATE without WHERE or LIMIT)的操作。

当您确实需要执行这类全表操作时,可以通过在SQL语句中添加特定的HINT来临时绕过这个安全限制。HINT是一种向DRDS解析器提供额外指令的方式,用于改变查询的执行策略。在您的例子中,使用了/!TDDL:FORBID_EXECUTE_DML_ALL=false*/或者/*TDDL:FORBID_EXECUTE_DML_ALL=false*/这样的HINT来允许执行全表的DELETE或UPDATE操作。

需要注意的是,尽管提供了这种方式来临时解除限制,强烈建议在执行这类操作前进行充分的数据备份,并确认该操作不会对业务造成不可逆的影响。此外,合理利用WHERE或LIMIT条件来精确控制影响的行数,是更安全、推荐的做法。

总之,DRDS的这一设计体现了“安全第一”的原则,旨在帮助用户在享受分布式数据库带来的扩展性与性能提升的同时,也能有效防止数据误操作风险。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答