2

对于我们的系统,我们使用多个具有相同结构的数据库。例如,当我们有 1000 个客户时,将有 1000 个数据库。我们选择为每个客户提供自己的数据库,这样我们就可以毫不费力地一次性删除他的所有数据。

现在我必须每年更新几次数据库结构。所以我开始编写一个循环遍历所有模式的存储过程。但我坚持执行动态 USE 语句。

我的代码如下:

DECLARE V_SCHEMA VARCHAR(100);
SET V_SCHEMA = 'SomeSchemaName';
SET @QUERYSTRING = CONCAT('USE ', V_SCHEMA);
PREPARE S FROM @QUERYSTRING;
EXECUTE S;
DEALLOCATE PREPARE S;

当我执行此代码时,我收到一条错误消息Error Code: 1295. This command is not supported in the prepared statement protocol yet。所以我假设我不能在过程中更改活动数据库。

我已经搜索了互联网,但我发现的唯一一件事是创建每个更改查询的字符串并准备/执行/解除分配它。我希望有一个更好的解决方案。我可以编写一个循环遍历模式并在其上执行 SQL 文件的 shell 脚本,但我更喜欢处理此问题的存储过程。

有谁知道如何使这项工作?

谢谢您的帮助!

编辑:我使用 MySQL 5.6 的最新稳定版本

4

2 回答 2

1

如果有一些已知的数据库,那么试着写一个 CASE。

否则,不要使用准备好的语句执行 USE 语句;相反,使用全名 - 构建其他语句(SELECT、INSERT、UPDATE,...)<database name> + '.' + <object name>,并使用准备好的语句执行它们。

于 2013-05-21T10:26:53.110 回答
0

如果您将结构更改放入临时模式中的存储过程中,则可以在 Workbench SQL 窗口中执行此操作。

您可以使用针对 的查询来构建您的迭代脚本information_schema,例如

SELECT GROUP_CONCAT(CONCAT('USE ',schema_name,'; CALL tmp.Upgrade')
                    SEPARATOR ';\n') AS BldCode
FROM   information_schema.schemata
WHERE  schema_name NOT IN
       ('information_schema', 'performance_schema', 'mysql', 'sakila', 'world', 'tmp')

由于您不能将其作为准备好的语句执行,您可以将 SQL 结果复制到新的 SQL 窗口中,然后运行它。

请注意,结构更改存储过程需要对当前架构进行操作,而不是指定架构。

于 2015-08-01T19:58:20.653 回答