2011-09-02 60 views
1

我目前正在編寫一些安裝程序腳本,根據系統的配置(web應用程序支持多個數據庫服務器,如MySQL,MSSQL和PostgreSQL)針對不同數據庫類型激發SQL文件。PostgreSQL執行語句有條件地由服務器版本

其中一種類型是PostgreSQL。我對此並不熟悉,我想知道是否可以向定義/填充SQL文件發出聲明,以使SQL查詢成爲特定PostgreSQL服務器版本的條件。

如何在普通PGSQL中有條件地生成SQL語句,以便它僅在版本9中執行?命令是:

ALTER DATABASE dbname SET bytea_output='escape'; 

版本檢查是將版本與9進行比較。

回答

2

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) 

然而真正的問題是,據我所知,你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; 

我認爲你應該使用索姆e腳本語言並使用它生成適當的SQL。

+0

感謝您的洞察力。我們正在使用PHP並有條件地執行語句。我認爲直接在PGSQL中執行會更容易,所以我可以減少PHP安裝程序腳本,但是,我認爲你已經回答了我的問題,這是我的夢想:) – hakre

+2

這並不總是奏效:我目前有'9.1rc1'和'9.2devel'。 ;-) –

+0

我試圖決定什麼是最穩定的,可能是這樣的東西?:'SELECT substring(version()from $$ PostgreSQL(\ d +)\。\ d + $$);' – isaaclw

0

也許你可以使事情依賴於輸出 select version(); (可能你必須修剪和子字符串)

順便說一句(某些)DDL語句不能從函數內發出;也許你必須逃避shell編程和這裏的文檔。

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

我很擔心你包含的'兩位數字版本'。它是不是剝離零?如果版本是91000(9.10.0),那你怎麼解釋? – isaaclw