0

我正在使用 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 脚本导入后)

4

1 回答 1

2

“相同的脚本在 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”开始一个命令时会自动知道您需要一个新的分组事务。如果它使代码对您来说更具可读性,您可以在 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
.;
于 2019-04-07T18:24:23.233 回答