2012-03-17 3 views
0

В моем приложении используется база данных PostgreSQL 9.1. Мы находимся в нашей бета-фазе, и мы иногда обнаруживаем ошибки в нашей схеме PostgreSQL. У нас есть установщик, написанный и работающий, но теперь мы находимся в том месте, где есть установки, которые необходимо будет обновить, когда мы сделаем нашу следующую версию.Как создать скрипт обновления схемы базы данных в PostgreSql 9.1?

Я отправил более ранний вопрос, спрашивая, как заставить мой сценарий принимать решения. Ответ, с которым я пошел, заключался в том, чтобы использовать инструкцию DO. Это отлично работает, но я столкнулся с проблемой.

Мы добавили таблицу в нашу базу данных, которая отслеживает последнюю версию, которая была установлена. Мой сценарий выглядит так:

DO $$$ 
BEGIN 
    IF NOT EXISTS (SELECT * FROM "CarSystem"."CarSystem_Versions" WHERE "VersionId" = 2) THEN 

     -- Schema update statements go here 

    END IF; 
END; 
$$$ LANGUAGE plpgSQL; 

Большинство утверждений являются простыми типами, такими как инструкции CREATE или DROP. Но одна из вещей, которые я должен сделать в этом следующем выпуске, - это применить кодовое изменение к сохраненной функции. Функция также записывается в plpgSQL. Я использовал три (3) $$$ символа в коде выше, потому что эта хранимая процедура использует два (2) $$ символа, потому что я полагал, что это сделает вложенные plpgSQL похожими, а не сделает второй набор знаков доллара прекратить первый ,

Но я получаю сообщение об ошибке, когда PostgreSQL попадает в инструкцию DECLARE в моей хранимой процедуре. Он не видит текст функции как цитируемый.

Каков правильный способ донга? Должен ли я просто поместить хранимую процедуру за пределы этого блока DO и использовать statemnt CREATE или REPLACE, чтобы объявить его? Или я могу сохранить код внутри условия?

Тони

ответ

2

Try:

DO $outer$ 
BEGIN 
    IF NOT EXISTS (SELECT * FROM "CarSystem"."CarSystem_Versions" WHERE "VersionId" = 2) THEN 

     -- Schema update statements go here 

    END IF; 
END; 
$outer$ LANGUAGE plpgSQL; 

4.1.2.4. Dollar-quoted String Constants

+0

Спасибо! Я дам этот выстрел завтра и посмотрю, смогу ли я заставить его работать. Звучит точно так, как мне нужно. –

+0

Это сработало для меня! Еще раз спасибо! –

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