HSQLDB SqlTool引发用户缺少特权或找不到对象

时间:2019-03-25 18:18:06

标签: hsqldb sqltools

我正在使用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 个答案:

答案 0 :(得分:1)

不可能“同一脚本正在HSQLDB Swing UI中工作。”

我将确切的脚本加载到了HSQLDB Swing UI v 2.4.1中,但由于“脚本中包含SqlTool特定的语法”,因此失败,出现“未知令牌:/错误代码:-5582 /状态:42582”。

如果我删除了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
.;
相关问题