【问题标题】:MySQL (5.7) drop stored procedures via mysql.procMySQL (5.7) 通过 mysql.proc 删除存储过程
【发布时间】: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。

标签: mysql stored-procedures


【解决方案1】:

procs 表中的直接delete 似乎不会在当前 MySQL 会话中立即生效。

flush 语句在 MySQL 中用于使服务器重新加载内容(直接通过更新/删除更改权限,flush privileges 可能是最好的类比)。但是,根据文档,我找不到任何会影响存储过程的flush 版本。因此,我认为没有任何方法可以在当前 MySQL 会话中最终删除存储的 proc。

直接删除方法的真正危险在于它依赖于 MySQL 的一个未记录的特性。在 MySQL 的未来版本中,此功能可能会更改,恕不另行通知,因此无法升级。此外,如果不实际调试 MySQL 本身,很难说您的方法是否有任何意外的副作用。

由于这些原因,我不建议在生产代码中使用这种方法。如果这是一次性的练习,那么您可能会侥幸成功。

【讨论】:

    猜你喜欢
    • 2020-12-12
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多