如何在Firebird 2.5.x中获取服务器名\主机名

时间:2019-02-13 13:18:42

标签: firebird

我使用Firebird 2.5,并且想要检索以下值

用户名:
我使用了SELECT rdb$get_context('SYSTEM', 'CURRENT_USER') FROM ...

数据库名称:
我使用了SELECT rdb$get_context('SYSTEM', 'DB_NAME') FROM ...

但是对于服务器名称,我没有找到任何客户端API,您知道如何使用SELECT语句检索服务器名称。

1 个答案:

答案 0 :(得分:0)

Firebird内置没有任何东西可以通过SQL获取服务器主机名(或主机名,因为服务器可以有多个主机名)。

最接近的方法是通过isc_info_firebird_version API函数请求isc_database_info信息项。返回的版本信息-如果通过TCP / IP连接-包括服务器的主机名。

但是,由于您这样做的主要原因是要区分SQL中的环境,因此最好寻找其他解决方案。一些想法:

使用外部表

您可以创建一个external table来包含所需的环境信息

在此示例中,我只是为环境类型输入了一个简短的,固定宽度的名称,但是您可以包括其他信息,只是要知道外部表格式是二进制格式。使用CHAR时,它将看起来像是固定宽度格式,其中小于声明值的值需要用空格填充。

您可以按照以下步骤操作:

  1. ExternalFileAccess中配置firebird.conf(在此示例中,您需要设置ExternalFileAccess = Restrict D:\data\DB\exttables)。

  2. 然后您可以创建表

    create table environment 
      external file 'D:\data\DB\exttables\environment.dat' (
      environment_type CHAR(3) CHARACTER SET ASCII NOT NULL 
    )
    
  3. 接下来,创建文件D:\data\DB\exttables\environment.dat并使用正好三个字符填充(例如,TST用于测试,PRO用于生产,等等)。您也可以插入值,否则将自动创建外部表文件。如果您想要更多的列或具有不同长度的数据等,则插入可能会更简单。请记住,它是二进制的,但是对所有列使用CHAR会使它看起来像文本。

    针对每个环境执行此操作,并确保文件是只读文件,以避免意外插入。

完成此操作后,您可以使用

获取环境信息。
select environment_type 
from environment

您可以为同一主机上的多个数据库共享同一文件,并且-默认情况下-外部文件不包含在gbak备份中(仅当您应用-convert备份选项时才包含这些文件),因此这将允许在环境之间移动数据库,而不会拖延这些信息。

使用UDF或UDR

您可以使用适当的编程语言编写UDF(用户定义的函数)或UDR(用户定义的例程),以返回所需的信息并在数据库中定义此函数。然后,Firebird可以从SQL调用此函数。

UDF被认为已弃用,如果可能,您应该使用Firebird 3中引入的UDR。

我自己从未写过UDF或UDR,因此无法详细描述。