HSQLDB SqlTool 抛出用户缺少权限或找不到对象
Posted
技术标签:
【中文标题】HSQLDB SqlTool 抛出用户缺少权限或找不到对象【英文标题】:HSQLDB SqlTool is throwing user lacks privilege or object not found 【发布时间】:2019-03-25 18:18:06 【问题描述】:我正在使用 SqlTool 执行 .sql 脚本。它一直说用户缺乏特权或找不到对象。相同的脚本在 Swing UI 中运行良好。
我的脚本 (hello.sql)
\.
SET DATABASE SQL SYNTAX ORA TRUE;
ALTER CATALOG PUBLIC RENAME TO SOMENAME;
COMMIT;
CREATE SCHEMA SOMESCHEMA;
COMMIT;
CREATE PROCEDURE SOMENAME.SOMESCHEMA.SP_FAILED_COUNT(IN i_ssn VARCHAR(100), IN i_page_id NUMBER(10), IN i_ip_address VARCHAR(100), IN i_session_guid VARCHAR(100), OUT o_toomanyfails VARCHAR(2000))
READS SQL DATA
BEGIN ATOMIC
SET o_toomanyfails = 'N';
END
COMMIT;
.
:;
例外
> java -jar sqltool-2.4.1.jar --autocommit --rcfile C:\\my-files\\hsqldb\\2.4.1\\dbmanager.rc web C:\\my-files\\hsqldb\\2.4.1\\hello.sql
Executing command from edit buffer:
"SET DATABASE SQL SYNTAX ORA TRUE;
ALTER CATALOG PUBLIC RENAME TO SOMENAME;
COMMIT;
CREATE SCHEMA SOMESCHEMA;
COMMIT;
CREATE PROCEDURE SOMENAME.SOMESCHEMA.SP_FAILED_COUNT(IN i_ssn VARCHAR(100), IN i_page_id NUMBER(10), IN i_ip_address VARCHAR(100), IN i_session_guid VARCHAR(100), OUT o_toomanyfails VARCHAR(2000))
READS SQL DATA
BEGIN ATOMIC
SET o_toomanyfails = 'N';
END
COMMIT;"
SEVERE SQL Error at 'C:\my-files\hsqldb\2.4.1\hello.sql' line 14:
"SET DATABASE SQL SYNTAX ORA TRUE;
ALTER CATALOG PUBLIC RENAME TO SOMENAME;
COMMIT;
CREATE SCHEMA SOMESCHEMA;
COMMIT;
CREATE PROCEDURE SOMENAME.SOMESCHEMA.SP_FAILED_COUNT(IN i_ssn VARCHAR(100), IN i_page_id NUMBER(10), IN i_ip_address VARCHAR(100), IN i_session_guid VARCHAR(100), OUT o_toomanyfails VARCHAR(2000))
READS SQL DATA
BEGIN ATOMIC
SET o_toomanyfails = 'N';
END
COMMIT;"
user lacks privilege or object not found: SOMENAME
org.hsqldb.cmdline.SqlTool$SqlToolException
同样的脚本在 HSQLDB Swing UI 中运行。
我尝试添加提交,但仍然无法正常工作。如果我从脚本中删除 catalogname.schemaname.(SOMENAME.SOMESCHEMA.) ,它工作正常
另外,我不明白一件事。
如果我在 Swing UI 中执行以下命令,它第一次可以完美运行,但如果我第二次执行,我会得到以下异常
用户缺少权限或找不到对象:PUBLIC / 错误代码:-5501 / 状态:42501
ALTER CATALOG PUBLIC RENAME TO SOMENAME;
确认目录已重命名。但是,如果我一次又一次地使用 sqltool 运行相同的脚本,它永远不会抛出相同的异常。如何使其从 sqltool 工作(即从 .sql 脚本导入后)
【问题讨论】:
【参考方案1】:不可能“在 HSQLDB Swing UI 中运行相同的脚本。”
我将确切的脚本加载到 HSQLDB Swing UI v. 2.4.1 中,但正如我预期的那样失败,出现“未知令牌:/错误代码:-5582/状态:42582”,因为您的脚本中有特定于 SqlTool 的语法。
如果我删除 Sql-Tool 特定语法,则 Swing UI 报告“用户缺少权限或找不到对象:SOMENAME / 错误代码:-5501 / 状态:42501”。
Fred T. 可以准确解释原因,但这些命令显然必须在两个事务中,我可以通过在一次执行中执行“CREATE SCHEMA”之前的所有内容来使其在 Swing UI 中工作;然后其余的在另一个执行。我怀疑你实际上编辑了你的脚本(没有运行“相同的脚本”),然后使用旧版本的 HyperSQL Swing UI 执行它,它没有在单个事务中执行所有命令。
SqlTool 没有这个限制,它允许您准确控制在哪个事务中执行哪些命令。只允许所有命令(COMMIT 是不必要的)在他们自己的事务中(这是默认行为)。然后就可以了。
提示:
您不需要 COMMIT,因为这些是 DDL 语句。 您可以 执行 .用“.;”终止交易代替 分离 ”。”和 ”:。”命令。 您不需要\。完全是因为 SqlTool 自动知道你需要一个新的分组事务 当它看到“CREATE PROCEDURE”开始一个命令时。如果它使 代码对您来说更具可读性,您可以立即插入“.\” 在创建过程之前。总的来说,这适用于 SqlTool:
SET DATABASE SQL SYNTAX ORA TRUE;
ALTER CATALOG PUBLIC RENAME TO SOMENAME;
CREATE SCHEMA SOMESCHEMA;
CREATE PROCEDURE SOMENAME.SOMESCHEMA.SP_FAILED_COUNT(IN i_ssn VARCHAR(100), IN i_page_id NUMBER(10), IN i_ip_address VARCHAR(100), IN i_session_guid VARCHAR(100), OUT o_toomanyfails VARCHAR(2000))
READS SQL DATA
BEGIN ATOMIC
SET o_toomanyfails = 'N';
END
.;
【讨论】:
以上是关于HSQLDB SqlTool 抛出用户缺少权限或找不到对象的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot 用户缺少权限或找不到对象 HSQLDB
Java HQL org.hsqldb.HsqlException:用户缺少权限或找不到对象
HSQLDB:java.sql.SQLSyntaxErrorException:用户缺少权限或找不到对象
Hibernate、mysql 和 Tomee - org.hsqldb.HsqlException:用户缺少权限或找不到对象