HSQLDB SqlTool 抛出用户缺少权限或找不到对象

HSQLDB SqlTool is throwing user lacks privilege or object not found

我正在使用 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.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.) 中删除 catalogname.schemaname.(SOMENAME.SOMESCHEMA.)

另外,还有一件事我没看懂。

如果我在 Swing 中执行以下命令 UI 它第一次运行完美,但如果我第二次执行我得到以下异常

用户缺少权限或未找到对象:PUBLIC/错误代码:-5501/状态:42501

ALTER CATALOG PUBLIC RENAME TO SOMENAME;

确认目录已重命名。但是,如果我 运行 同一脚本一次又一次地使用 sql 工具,它永远不会抛出相同的异常。如何使其在 sql 工具中工作(即从 .sql 脚本导入后)

没办法"The same script is working from HSQLDB Swing UI."

我将确切的脚本加载到 HSQLDB Swing UI v. 2.4.1 中,但正如我预期的那样,"unknown token: / Error Code: -5582 / State: 42582" 它失败了,因为你的脚本中有 Sql 特定于工具的语法.

如果我删除 Sql-工具特定语法,则 Swing UI 报告 "user lacks privilege or object not found: SOMENAME / Error Code: -5501 / State: 42501"。

Fred T. 可以准确解释原因,但这些命令显然必须在两个事务中进行,我可以通过在一次执行中执行 "CREATE SCHEMA" 之前的所有内容来使它在 Swing UI 中工作;然后在另一个执行中休息。我怀疑您实际上编辑了您的脚本(不是 运行 "The same script"),然后使用旧版本的 HyperSQL Swing UI 执行它,它没有在单个事务中执行所有命令.

Sql工具没有该限制,允许您准确控制在哪个事务中执行哪些命令。只允许所有命令(COMMIT 是不必要的)在它们自己的事务中(这是默认行为)。然后就可以了。

提示:

  • 您不需要 COMMIT,因为这些是 DDL 语句。
  • 你可以 执行 .交易以“.;”结束代替 分离 ”。”和 ”:。”命令。
  • 你不需要\。完全是因为 Sql工具自动知道您需要一个新的分组事务 当它看到 "CREATE PROCEDURE" 开始命令时。如果它使 代码对您来说更具可读性,您可以立即插入“.\” 在 CREATE PROCEDURE 之前。

总而言之,这来自 Sql工具:

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
.;