Как заставить работать скрипт обновления схемы базы данных в PostgreSql 9.1? - PullRequest
0 голосов
/ 18 марта 2012

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

Я разместил здесь более ранний вопрос, спрашиваякак заставить мой сценарий принимать решения.Ответ, с которым я пошел, состоял в том, чтобы использовать утверждение 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 и использовать состояние CREATE OR REPLACE для ее объявления?Или есть способ, которым я могу сохранить код в условии?

Тони

1 Ответ

2 голосов
/ 18 марта 2012

Попробуйте:

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. Строковые константы, указанные в долларах

...