我正在尝试编写一个
SQL
函数来确定Postgres服务器是否在Windows上运行,这可能吗?或者有没有办法获取正在运行的服务器的平台?
您可以简单地使用
select version()
version
-------------------------------------------------------------------------------------------------
PostgreSQL 9.6.8 on x86_64-pc-linux-musl, compiled by gcc (Alpine 6.2.1) 6.2.1 20160822, 64-bit
(1 row)
您可以在这里获得有关 postgres 系统信息函数的更多信息 https://www.postgresql.org/docs/current/functions-info.html
希望对你有帮助!
这是我最后编写和使用的代码,它在 Postgres 11 版本上运行得很好:
CREATE OR REPLACE FUNCTION GetPLatform()
RETURNS varchar
AS
$$
declare platform varchar;
begin
SELECT CASE
WHEN OSVersion.OS LIKE '%w64%' THEN 'windows'
WHEN OSVersion.OS LIKE '%w32%' THEN 'windows'
WHEN OSVersion.OS LIKE '%mingw%' THEN 'windows'
WHEN OSVersion.OS LIKE '%visual studio%' THEN 'windows'
WHEN OSVersion.OS LIKE '%linux%' THEN 'linux'
WHEN OSVersion.OS LIKE '%mac%' THEN 'mac'
ELSE
'UNKNOWN'
END into platform
FROM (SELECT
substr(substr(version(), strpos(version(), ' on ')+3), 1,
strpos(substr(version(), strpos(version(), ' on ')+3),
', compiled by')-1) as OS)
as OSVersion;
return platform;
end;
$$
LANGUAGE PLPGSQL;
select GetPLatform()
您可以根据需要调整其他平台...
因为使用 mmap 的情况非常少见,所以你可以使用 :
SELECT CASE setting
WHEN 'windows' THEN 'WINDOWS family'
WHEN 'posix' THEN 'UNIX family'
WHEN 'sysv' THEN 'UNIX family'
ELSE 'UNKNOWN'
END AS OS_family
FROM pg_catalog.pg_file_settings
WHERE name = 'dynamic_shared_memory_type'
另一个解决方案可能是:
SELECT CASE setting
WHEN '0700' THEN 'Windows'
ELSE 'UNIX'
END AS OS_FAMILLY
FROM pg_settings
WHERE name = 'data_directory_mode'
显示 UNIX 或 Windows 之间的操作系统系列...