我目前正在编写一些安装程序脚本,根据系统的配置针对不同的数据库类型触发SQL文件(webapplication支持多个数据库服务器,如MySQL,MSSQL和PostgreSQL)。
其中一种类型是PostgreSQL。我不熟悉它,我想知道是否可以在一个定义/填充SQL文件中发表声明,使得SQL查询以特定的PostgreSQL服务器版本为条件。
如何在普通PGSQL中有条件地生成SQL语句,以便它只在版本9中执行?命令是:
ALTER DATABASE dbname SET bytea_output='escape';
版本检查是将版本与9
进行比较。
答案 0 :(得分: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'
如果您希望它与两位数版本兼容。
答案 1 :(得分: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)
然而,真正的问题是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。
答案 2 :(得分:0)
也许你可以依赖于输出 select version(); (可能你需要修剪和子串一点)
BTW(某些)DDL语句可能不会从函数内发出;也许你将不得不逃避shell编程和here-documents。