2011-09-02 5 views
1

저는 현재 시스템 구성에 따라 다른 데이터베이스 유형에 대해 SQL 파일을 실행하는 설치 프로그램 스크립트를 작성하고 있습니다 (웹 응용 프로그램은 MySQL, MSSQL 및 PostgreSQL과 같은 여러 데이터베이스 서버를 지원합니다).PostgreSQL은 서버 버전에 따라 조건부로 명령문을 실행합니다.

이러한 유형 중 하나는 PostgreSQL입니다. 필자는 유창하지 못하며 SQL 쿼리를 특정 PostgreSQL 서버 버전에 조건부로 만드는 SQL 파일을 정의/채우는 것에 대한 진술을 할 수 있는지 알고 싶습니다.

버전 9에서만 실행되도록 일반 PGSQL에서 조건부로 SQL 문을 작성하는 방법은 무엇입니까? 명령은 다음과 같습니다.

ALTER DATABASE dbname SET bytea_output='escape'; 

버전 확인은 9의 버전을 비교하는 것입니다.

답변

2

포스트그레스에는 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 당신이 순수 "에 조건부 명령을 실행 can't이다 "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

통찰력에 감사드립니다. 우리는 acutally PHP를 사용하고 조건에 맞는 문장을 실행합니다. 나는 PHP 설치 스크립트를 줄이기 위해 PGSQL에서 직접하는 것이 더 쉽다고 생각했지만 글쎄, 내 질문에 잘 대답했다고 생각한다. 내 꿈이다. – hakre

+2

항상 작동하지는 않는다. 나는 현재 9.1rc1과 9.2devel을 가지고있다. ;-) –

+0

가장 안정적인 것이 무엇인지 결정하려고합니다. 예를 들면 다음과 같습니다. : $$ PostgreSQL (\ d +) \. \ d + $$)의 SELECT 부분 문자열 (version()), – isaaclw

0

아마도 출력물에 따라 달라질 수 있습니다. select version(); (아마도 약간의 부분을 다듬어서 부분 문자열을 사용해야 할 것입니다)

BTW (일부) DDL 문은 함수 내에서 발행되지 않을 수 있습니다. 어쩌면 셸 프로그래밍과 여기 문서에서 벗어나야 할 것입니다.

4

아니면 주요 버전이 필요한 경우는

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' 
,

은 두 자릿수 버전과 호환되기를 원합니다.

+0

+1 'server_version'와'server_version_num'의 스마트 사용을위한 [미리 설정 옵션] (http : //www.postgresql.org/docs/current/static/runtime-config-preset.html) :) –

+0

포함 된 '2 자리 버전'에 대해 걱정이됩니다. 0을 제거하지 않습니까? 버전이 91000 (9.10.0)이라면 어떻게 생각하십니까? – isaaclw

관련 문제