2010-11-29 2 views
0

Мы работаем над объединением отдельных файлов в группу PostgreSQL. Файлы все отлично работают сами по себе, и когда мы объединили их, мы запускаем их без проблем. Он начал зависать при создании одного триггера, поэтому мы прокомментировали триггер. В следующий раз, когда мы запускали файл слияния мы получили следующее сообщение об ошибке:Ошибка синтаксиса PostgreSQL eof вызвала фиксацию

ERROR: Syntax error at end of input 
LINE 181: --$$ LANGUAGE plpgsql 

Ниже этой ошибки были последующие синтаксические ошибки, а затем к нашему ужасу, мы обнаружили следующее в нашем файле журнала:

ERROR: Syntax error at end of input 
LINE 181: --$$ LANGUAGE plpgsql 
COMMIT 

У нас были тесты в этом файле, которые содержали тестовые данные, которые НЕ должны были вводиться в базу данных, развращая, кто знает, сколько данных в нашей базе данных. Мы просмотрели все прилагаемые файлы и нет COMMIT в любом месте!

Неужели кто-нибудь сталкивается с чем-то подобным? Есть ли причина, по которой ошибка в синтаксическом анализе могла бы вызвать фиксацию?

+0

РАСШИРЕНИЕ: Кажется, что произошло то, что он получил половину пути комментария, интерпретировал что-то как EOF, продолжал синтаксический анализ, обнаружил ошибку и каким-то образом интерпретировал байты как фиксацию. Кто-нибудь знает, есть ли ЛЮБОЙ ПУТЬ, чтобы вернуть базу данных в предыдущее состояние? Это крайне вредно, и у нас нет НИКАКИХ ВОПРОСОВ, чтобы выполнить ручную перестройку !! – 2010-11-29 04:49:03

ответ

2

Если у вас нет оператора BEGIN, соединение PostgreSQL находится в режиме «autocommit», фиксируя каждое изменение после выполнения оператора. Поскольку вы неправильно комментируете свой код, я бы сказал, что вы прокомментировали заявление BEGIN ранее в коде. Но я не могу быть уверен, потому что вы не предоставили ни один из ваших SQL.

Обратите внимание, что синтаксис:

--$$ 

не закомментировать конец функции $$. Это означает, что пустой комментарий является последним в строке. Это может помочь вам, если вы читаете эту линию как:

-- 
$$ 

Вот почему вы получаете ошибку синтаксического анализа на «комментировал» линии. Если бы это было фактически прокомментировано, PostgreSQL не будет анализировать его. $$ - оператор котировки, содержащий код SQL, и является просто удобной синтаксисом против использования ' для цитирования (что означало бы, что вам нужно дважды указывать каждую цитату внутри цитированного SQL). То, что вы считаете прокомментированной строкой, было на самом деле всего лишь частью строки, заканчивающейся двумя дефисом.

В целом примечание. Вы должны использовать комментарии только для добавления описаний в код, а не для отключения разделов кода. Используйте контроль версий, если вам нужен доступ к более старым версиям кода.

Редактировать: Уточненные пояснения по цитируемым строкам. Надеюсь, теперь это имеет больше смысла.

+0

Это имеет большое значение. Это было для университетского проекта, который должен был состояться всего через несколько часов после публикации этого вопроса. Профессор, преподающий этот класс баз данных, не перебирает ни один SQL (или в этом случае postgreSQL), и оставляет это до TA. Единственное, что делает TA, - кратко остановиться на некоторых примерах построения базовой таблицы и выполнения различных операций над этими таблицами, чтобы эти маленькие нюансы (комментарии, которые не комментировали код и т. Д.) Нам никогда не объясняли, и, как вы можете видеть, они вызвало большие осложнения. Большое вам спасибо, это ясно. – 2010-11-30 22:42:04

Смежные вопросы