【发布时间】:2018-08-22 21:50:50
【问题描述】:
总结:从 MySQL 5.7 开始可以安全使用DELETE from mysql.proc 吗?
在问题 Drop all stored procedures in MySQL or using temporary stored procedures 中,提到在 MySQL 中无法在存储过程中使用 DROP PROCEDURE(mysql 错误代码 1357,“无法从另一个存储例程中删除或更改 %s” )。
根据经验:
DELETE from mysql.proc WHERE db = <db-name> AND name LIKE '<procedure-prefix>%';
似乎确实可以正常工作。
在评论中,有人问了这个问题(但没有回答):
mysql.proc 在 5.7 中仍然是与 MySQL 元信息交互的可行方法吗?
即使我完全意识到它不是“可取的”,在 MySQL 5.7 中使用它是否“可以”?或者,DROP PROCEDURE 是否有一些重要的东西,所以我不能使用这个解决方法?
【问题讨论】:
-
delete语句后可以执行存储的proc吗?
-
@Shadow 非常非常好的观察!是的,不幸的是我仍然可以:(从Workbench,Refresh All显示sp不再存在,但它仍然可以在同一个会话中执行。退出Workbench并重新启动它会清除“缓存”。任何解决方法也是如此(我不'实际上并不关心它,下一次会议删除就足够了),还是我现在正在研究一个危险领域太多的例子?
-
flush语句在 MySQL 中用于使服务器重新加载内容(通过更新/删除直接更改权限,flush privileges可能是最好的类比)。但是,根据文档,我找不到任何会影响存储过程的刷新版本。您的方法的真正危险在于它依赖于 MySQL 的一个未记录的特性。在 MySQL 的未来版本中,此功能可能会更改,恕不另行通知,因此无法升级。 -
另外,如果不实际调试 MySQL 本身,很难说您的方法是否有任何意外的副作用。
-
@Shadow 感谢您的宝贵时间。如果您希望将以上内容作为答案发布,我将标记为已接受(如果我没有很快得到任何改善!),或者我们可以随意留在 cmets。