HSQLDB SqlTool выбрасывает пользователю не хватает привилегий или объект не найден - PullRequest
0 голосов
/ 25 марта 2019

Я выполняю сценарии .sql, используя SqlTool.Он продолжает говорить, что пользователю не хватает привилегий или объект не найден.Тот же скрипт отлично работает в Swing UI.

My Script (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, она отлично работает в первый раз, но если я выполняю во второй раз, я получаю следующее исключение

пользователю не хватает привилегии или объект не найден: PUBLIC /Код ошибки: -5501 / Состояние: 42501

ALTER CATALOG PUBLIC RENAME TO SOMENAME;

Это подтверждает, что каталог переименован.Но если я снова и снова запускаю один и тот же скрипт, используя sqltool, он никогда не выдает одно и то же исключение.Как заставить его работать из sqltool (т.е. после импорта из скрипта .sql)

1 Ответ

2 голосов
/ 07 апреля 2019

Нет способа, чтобы «Тот же скрипт работал из HSQLDB Swing UI».

Я загрузил точный сценарий в HSQLDB Swing UI v. 2.4.1, и он завершился неудачно, как и ожидалось, с «неизвестным токеном: / Код ошибки: -5582 / Состояние: 42582», поскольку в вашем сценарии есть специфичная для SqlTool грамматика.

Если я удаляю специфическую грамматику Sql-Tool, то пользовательский интерфейс Swing сообщает: «пользователю не хватает привилегии или объект не найден: SOMENAME / код ошибки: -5501 / состояние: 42501».

Фред Т. может точно объяснить, почему, но эти команды, очевидно, должны быть в двух транзакциях, и я могу заставить его работать из Swing UI, просто выполнив все перед «CREATE SCHEMA» в одном исполнении; потом отдых в другом исполнении. Я подозреваю, что вы на самом деле отредактировали свой скрипт (без запуска «Тот же скрипт»), а затем выполнили его с более старой версией пользовательского интерфейса HyperSQL Swing, где он не выполнил все команды в одной транзакции.

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