gpt4 book ai didi

mysql - 是否有 JDBC w/liquibase 和 MySQL session 变量和客户端 SQL 指令的解决方法

转载 作者:行者123 更新时间:2023-11-29 01:24:54 25 4
gpt4 key购买 nike

慢慢地为我的雇主的三个主要架构之一构建一个起始的changeSet xml 文件。唯一的障碍是合并了由 liquibase 管理的相当大的 MySQL 存储过程库。

处理一个存储过程有点痛苦:前几条语句就像这样

use TargetSchema;
select "-- explanatory inline comment thats actually useful --" into vDummy;

set @@session.sql_mode='TRADITIONAL' ;

drop procedure if exists adm_delete_stats ;

delimiter $$

create procedure adm_delete_stats(
...rest of sproc

我删除了 use 语句,因为它会适得其反,但真正的问题是 set @@session.sql_mode 语句,它会导致类似的异常

 liquibase.exception.MigrationFailedException: Migration failed for change set ./foobarSchema/sprocs/adm_delete_stats.xml::1293560556-151::dward_autogen dward:
Reason: liquibase.exception.DatabaseException: Error executing SQL ...

然后,delimiter 语句是另一个绊脚石。

在进行勤奋研究时,我发现这个被拒绝的 MySQL 错误报告 here这个 MySQL 论坛主题更深入地探讨了这个问题 here .

我是否可以使用 Liquibase 当前存在的 sproc 脚本,或者我是否必须重写数百个存储过程?

我尝试过 createProcedure、sqlFile 和 sql liquibase 标签,但运气不佳,因为我认为核心问题是 set、delimiter 和类似的 SQL 命令在交付之前应由客户端解释器进行解释和执行到服务器。

最佳答案

是的,我认为问题在于您的脚本假设它将通过 mysql 客户端运行,该客户端具有 JDBC 中不存在的附加功能。

Liquibase 将在分隔符上分割语句(默认为 ; 但可以使用分隔符属性进行更改),然后将每个语句提供给数据库。如果指定 $$ 作为分隔符,则可以删除“分隔符 $$”行,但其前面的每一行都需要有 ;替换为$$。除此之外,还有其他特定于客户端的 SQL,例如 @@session 行。我认为如果不经过客户端,这可能是不必要的,但我不完全确定它的作用。

您应该能够使您的程序正常工作,但这需要一些重写。

如果您不想重写所有程序,您可以使用类似 executeCommand 的内容。标签允许您调用 mysql 客户端并输入现有脚本。你失去了 liquibase 给你的一些东西,比如 updateSQL 模式,你必须确保 mysql 客户端存在于你运行变更日志的任何地方,但这会让你不必重写你的脚本。

关于mysql - 是否有 JDBC w/liquibase 和 MySQL session 变量和客户端 SQL 指令的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4556551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com