在对数据库进行结构性更改后更新MySQL存储过程。

3
我希望您能帮我解决这个问题。我运行一个使用MySQL数据库的网站。我在MySQL Workbench中建立了数据库模型,所有的SQL查询都是存储过程。 问题在于,当我对数据库进行结构性更改时,我不知道哪些存储过程会受到影响,所以我要么手动列出所有的存储过程并手动进行更改,要么使用尝试和错误的方法。 问题是 - 有没有一种自动化存储过程更新过程的方法。我想知道在对数据库进行某些结构性更改时,哪些存储过程会受到影响。 如果MySQL无法实现,那么其他数据库是否可以实现?(开源或商业) 谢谢。
2个回答

3

在Oracle中,如果任何依赖对象被更改或变得无效,则存储过程会变为无效。这些依赖对象包括其他被引用的存储过程、表、包等。

要查找当前所有无效对象的计数,可以执行以下操作:

SELECT object_type, count(*)
FROM user_objects
WHERE status = 'INVALID'
GROUP BY object_type

DBA可以简单地运行脚本($ORACLE_HOME/rdbms/admin/utlrp.sql)来编译所有无效对象(视图、存储过程、包、函数、触发器等)。像Toad这样的Oracle第三方工具通过GUI提供类似的功能。


感谢您提供这宝贵的建议。也许有一天我会决定从MySQL转移。 - Evgeny Tryastsin

1

在进行更改之前,MySQL不会向您返回有关受影响过程的信息,直到您实际运行该过程(这将导致错误)。INFORMATION_SCHEMA具有一个名为ROUTINES的表,其中MySQL提供有关存储过程(包括过程和函数)的信息:

USE INFORMATION_SCHEMA;
DESCRIBE ROUTINES;
SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM ROUTINES;

我自己没有尝试过,但我相信您可以编写一个 SQL 查询来搜索 ROUTINE_DEFINITION 行中更改的列名,并提供需要修改的所有存储过程列表。
请记住,任何对存储过程的更改都需要使用 DROP PROCEDURE / CREATE PROCEDURE 命令完成。您不能直接在 INFORMATION_SCHEMA 数据库中进行任何更改。
更多信息请参见:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接