mysql脚本执行不全_执行MySQL脚本文件遇到的问题

本文探讨了在Linux环境下调试安装包时遇到的问题,即如何处理因SQL文件中存储过程和触发器的分隔符冲突导致的mysqlload加载失败。作者提供了临时改变分隔符的解决方案,以及Windows环境下可能遇到的权限问题和相应解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在调试linux安装包的时候,发现原来的sql文件不能直接被mysql load。

问题的根本原因是 触发器 和 存储过程 load失败。

现在的安装流程里面,是管理工具在第一次加载的时候,通过java,逐行调用sql语句来完成的。

这里的说的“逐行”实际是按照"-- -------------"这样的分隔符。

mysql命令在load sql的时候,默认的分割符是";",也就是按照 ";" load 语句来执行。

但是对于 存储过程 和 触发器,是一个代码块,在整个代码块中间是有 ";"的,

导致不能正常的load。

比较标准的做法是在 sql文件中 创建触发器和存储过程的时候,使用delimiter 申明来临时改变 分割符。

在触发器和存储过程的结尾使用 这个改变过的分隔符,表示存储过程或者触发器的结尾。然后再使用delimiter 把分隔符改回去。

如下:

delimiter // 《== 有了这个申明后,mysql在load sql语句的时候,就不是以;为一个语句的结尾,而是以//为一个语句的结尾。

CREATE TRIGGER insert_radpostauth BEFORE INSERT ON radpostauth

FOR EACH ROW

BEGIN

declare v_username varchar(20) default '';

declare v_usergroupid int(11) default null;

declare v_cardid varchar(18) default "";

declare v_cardtype varchar(20) character set utf8 default "";

declare v_groupname varchar(20) default "";

select name, usergroupid, cardid, cardtype into v_username, v_usergroupid, v_cardid, v_cardtype

from dbradius.bill_user where bill_user.account = new.userName;

select groupname into v_groupname from dbradius.bill_usergroup where bill_usergroup.usergroupid = v_usergroupid;

insert dbradius.bill_detail (account, username, acctsessionid, auditip, authResult, cardid, cardType, usergroupid, groupname)

values (new.userName, v_username, new.acctsessionid, new.auditip, new.authResult, v_cardid, v_cardtype, v_usergroupid, v_groupname);

END;//

delimiter ;针对linux安装包的修改,可能导致windows下的安装包在load sql的时候出现问题。

在Windows下执行了如上修改后的TRIGGER后,使用JDBC会执行失败。查看TRIGGER语句如下:

SELECT * FROM information_schema.`TRIGGERS`;

改为CMD运行时,无误,但是在Java中运行时报如下 的错误:

java.io.IOException: Cannot run program "mysql": CreateProcess error=2, ϵͳÕҲ»µ½ָ¶

at java.lang.ProcessBuilder.start(ProcessBuilder.java:459)

at java.lang.Runtime.exec(Runtime.java:593)

at java.lang.Runtime.exec(Runtime.java:431)

at java.lang.Runtime.exec(Runtime.java:328)

at com.network.manager.nmsmanager.test.Test.runCmd(Test.java:29)

at com.network.manager.nmsmanager.test.Test.main(Test.java:19)表示权限不够,可以将执行的文件放到D盘下试一试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值