Оператор выполнения PostgreSQL условно зависит от версии сервера - PullRequest
1 голос
/ 02 сентября 2011

В настоящее время я пишу некоторый установочный скрипт, который запускает файлы SQL для разных типов баз данных в зависимости от конфигурации системы (веб-приложение поддерживает несколько серверов баз данных, таких как MySQL, MSSQL и PostgreSQL).

Одним из таких типов являетсяPostgreSQL.Я не свободно владею им, и мне хотелось бы знать, возможно ли сделать оператор в файле определения / заполнения, который делает запрос SQL условным для конкретной версии сервера PostgreSQL.

Как создатьОператор SQL условно в простом PGSQL, чтобы он выполнялся только в версии 9?Команда:

ALTER DATABASE dbname SET bytea_output='escape';

Проверка версии заключается в сравнении версии с 9.

Ответы [ 3 ]

4 голосов
/ 02 сентября 2011

Или вы можете просто использовать

select setting from pg_settings where name = 'server_version'

Или

select setting from pg_settings where name = 'server_version_num'

Если вам нужна только основная версия

select Substr(setting, 1, 1) from pg_settings where name = 'server_version_num'

или

select Substr(setting, 1, strpos(setting, '.')-1) from pg_settings where name = 'server_version'

, если вы хотите, чтобы он был совместим с двузначными версиями.

2 голосов
/ 02 сентября 2011

Postgres имеет функцию version(), однако major_vesion() отсутствует. Предполагая, что выходная строка всегда содержит номер версии как number(s).number(s).number(s), вы можете написать свою собственную обертку как:

CREATE OR REPLACE FUNCTION major_version() RETURNS smallint
AS $BODY$ 
    SELECT substring(version() from $$(\d+)\.\d+\.\d+$$)::smallint;
$BODY$ LANGUAGE SQL;

Пример:

=> Select major_version();
 major_version
---------------
             9
(1 row)

Однако реальная проблема заключается в том, что AFAIK вы не можете выполнить ваши команды условно в «чистом» SQL, и лучшее, что вы можете сделать, это написать какую-нибудь хранимую функцию, подобную этой:

CREATE OR REPLACE FUNCTION conditionalInvoke() RETURNS void
AS $BODY$
BEGIN
    IF major_version() = 9 THEN
        ALTER DATABASE postgres SET bytea_output='escape';
    END IF;
    RETURN;
END;
$BODY$ LANGUAGE plpgsql;

Я думаю, что вам лучше использовать некоторый язык сценариев и генерировать соответствующий SQL с ним.

0 голосов
/ 02 сентября 2011

Может быть, вы могли бы сделать вещи зависимыми от вывода выберите версию (); (вероятно, вам придется немного обрезать и подстроковать)

Кстати (некоторые) операторы DDL не могут быть выданы изнутри функций; возможно, вам придется уйти в программирование оболочки и здесь-документы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...