2013-11-25 1 views
5

Ну, это странно, может ли кто-нибудь помочь мне указать, где эта функция может быть неправильной. У меня есть функция, похожая наошибка миграции postgres; строка с неисполненным долларом

CREATE FUNCTION check_password(uname TEXT, pass TEXT) 
RETURNS BOOLEAN AS $$ 
DECLARE passed BOOLEAN; 
BEGIN 
     SELECT (pwd = $2) INTO passed 
     FROM pwds 
     WHERE username = $1; 

     RETURN passed; 
END; 

$$ LANGUAGE plpgsql 

Когда я запустить его непосредственно в SQL консоли pgAdmin, нет никаких ошибок, но запустить его в сценарии миграции с помощью DB-миграционного-Maven-плагин я получаю сообщение об ошибке.

Error executing: CREATE FUNCTION check_password(uname TEXT, pass TEXT) 
       RETURNS BOOLEAN AS $$ DECLARE passed BOOLEAN 
org.postgresql.util.PSQLException: ERROR: unterminated dollar-quoted 
         string at or near "$$ DECLARE passed BOOLEAN" 
Position: 74 
+0

Извините, перед лицом той же проблемы сейчас. Вы нашли способ исправить это? –

+1

Я избегал писать длинные функции вместе. Это проблема с программным обеспечением для миграции (carbonfive). Я подумал о том, чтобы внести в него несколько изменений, поскольку он открыт, но у него нет времени. – ivanorone

+0

Я получил аналогичное сообщение об ошибке, используя Aqua Data Studio, в котором используется драйвер Redshift JDBC. В моем случае исправление заключалось в том, чтобы перейти в «Настройки» и «Отменить»; Разделитель сообщений. Похоже, что синтаксический анализатор предположил, что первая точка с запятой была окончанием определения всей функции, и она еще не видела закрытия $$. Ваша функция примера была создана без ошибок в моей системе (версия 9.5), когда эта ячейка не была отмечена галочкой. С '; Отметив галочку «Сепаратор», я получил ту же ошибку. Надеюсь, что помогает. – Jason

ответ

2

SQL, за счет вашей миграции сценариев, вероятно, какой-то $$ цитаты в них, что получает интерпретированы как строку где-нибудь.

Быстрое и грязное исправление может состоять в том, чтобы сменить $$ на $func$ или даже на $check_password$, хотя могут быть другие функции в дальнейшем, которые страдают той же проблемой.

Лучшим, более долгосрочным подходом будет поиск нарушителя $$.

+0

Я так подумал, изменил $$ до $ func $, но все же это не помогло – ivanorone

+0

@ivan_d_coder: у него не получилось с тем же сообщением об ошибке или в другом месте? –

+0

в том же месте и той же ошибкой: – ivanorone

2

@ivanorone: имеется ошибка, связанная с db-migration-maven-plugin: https://code.google.com/p/c5-db-migration/issues/detail?id=9 В комплект поставки входит патч, но, глядя на его источник, он действительно не исправляет проблему должным образом. Кроме того, проект, похоже, работает на холостом ходу (последний коммит 2010).

Существует еще один плагин, который я пытаюсь использовать вместо этого. Flyway: http://flywaydb.org/ Переключение на него было довольно простым, и до сих пор оно отлично работает.

+1

Согласен, flywaydb кажется более активным, чем carbon5 b-migration-maven-plugin. Я не воспринял это всерьез, но скоро посмотрю – ivanorone

0

Раствор для Grails Database Migration Plugin

changeSet(author: "...", id: "...") { 
    sql(splitStatements: false, ''' 
     CREATE FUNCTION trigger_func() RETURNS TRIGGER AS $$ 
     DECLARE var text; 
     BEGIN 
     ... 
     END $$ LANGUAGE plpgsql; 
    ''') 
} 
0

Выполните запрос в качестве одного пакетного (Подсказка: используйте сочетание клавиш Ctrl + F5) .Когда я побежал запрос в Postgres SQl (Greenplum Interface) я получил ошибку похожую как у указанных выше. Я обнаружил, что db выполняет запрос, разбивая его на основе завершения в нашем запросе (точка с запятой). По мере того, как мы закончили три раза в вашем запросе, он выполняет его по одному утверждению. Таким образом, чтобы выполнить его в целом, пакетный запуск выполняется с использованием выполнения как отдельной партии в вашем варианте выполнения.

Надеюсь, это вам поможет :) :)