PostgreSQL 实现了 SQL/MED 规范的部分内容,允许您使用常规 SQL 查询访问驻留在 PostgreSQL 外部的数据。此类数据称为外部数据。(请注意,不要将此用法与外键混淆,外键是数据库中的一种约束。
外部数据是在外部数据包装器的帮助下访问的。外部数据包装器是一个库,可以与外部数据源进行通信,隐藏连接到数据源并从中获取数据的详细信息。有一些外部数据包装器可作为模块使用;。其他类型的外部数据包装器可能会被发现为第三方产品。如果现有的外部数据包装器都不符合您的需求,您可以编写自己的包装器contrib;。
若要访问外部数据,需要创建一个外部服务器对象,该对象定义如何根据其支持的外部数据包装器使用的选项集连接到特定的外部数据源。然后,您需要创建一个或多个外部表,用于定义远程数据的结构。外表可以像普通表一样用于查询,但外表在 PostgreSQL 服务器中没有存储。每当使用它时,PostgreSQL 都会要求外部数据包装器从外部源获取数据,或者在更新命令的情况下将数据传输到外部源。
访问远程数据可能需要对外部数据源进行身份验证。此信息可以由用户映射提供,该映射可以根据当前 PostgreSQL 角色提供其他数据,例如用户名和密码。
PostgreSQL提供了多种方式来处理外部数据。以下是几种常见的方法:
外部数据包装程序(Foreign Data Wrappers):PostgreSQL支持使用外部数据包装程序来连接和查询不同类型的外部数据源,包括其他关系型数据库(如MySQL、Oracle)、非关系型数据库(如MongoDB、Redis)以及其他数据存储系统(如Hadoop、HDFS)等。外部数据包装程序充当了PostgreSQL和外部数据源之间的中间层,使得外部数据可以在PostgreSQL中像本地数据一样进行操作。
创建外部数据包装器的语法如下:
CREATE FOREIGN DATA WRAPPER wrapper_name [HANDLER handler_function] [VALIDATOR validator_function] [OPTIONS (option_name 'option_value', ...)]
wrapper_name是正在创建的外部数据包装器的名称。HANDLER选项指定一个函数的名称,该函数将处理外部数据包装器上的操作。VALIDATOR选项指定一个函数的名称,该函数将在使用该外部数据包装器创建或修改服务器时验证这些选项。
OPTIONS选项用于指定外部数据包装器的选项。这些选项被指定为逗号分隔的键-值对列表。
下面是一个创建外部数据包装器的示例:
CREATE FOREIGN DATA WRAPPER my_wrapper HANDLER my_handler_function VALIDATOR my_validator_function OPTIONS (option1 'value1', option2 'value2');
在本例中,"my_wrapper"是外部数据包装器的名称,"my_handler_function"是处理程序函数的名称,"my_validator_function"是验证器函数的名称,"option1"和"option2"是外部数据包装器的选项。
外部表(Foreign Tables):外部表是一种特殊的表,它不存储数据,而是通过外部数据源中的数据动态生成。可以使用PostgreSQL的外部数据包装程序(Foreign Data Wrappers)来创建外部表,并通过SQL语句直接访问外部数据。
要在PostgreSQL中创建外表,可以使用以下语法:
CREATE FOREIGN TABLE table_name (
column1 data_type,
column2 data_type,
...
) SERVER server_name
OPTIONS (option1 'value1', option2 'value2', ...);
下面是语法细分:
下面是一个使用postgres_fdw扩展名创建一个名为employees的外表的例子:
CREATE EXTENSION IF NOT EXISTS postgres_fdw;
CREATE SERVER my_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (
host '127.0.0.1',
port '5432',
dbname 'my_database'
);
CREATE USER MAPPING FOR my_username SERVER my_server OPTIONS (
user 'my_username',
password 'my_password'
);
CREATE FOREIGN TABLE employees (
id INT,
name VARCHAR(50),
age INT,
salary NUMERIC
) SERVER my_server OPTIONS (
table_name 'employees'
);
在这个例子中,我们首先创建postgres_fdw扩展,如果它还不存在的话。然后,我们创建服务器、用户映射,最后创建具有指定列和选项的外表。
注意,外部表提供了一种使用PostgreSQL访问存储在外部数据源中的数据的方法,但实际数据驻留在数据库之外。因此,您需要确保拥有访问外部数据源所需的权限和特权。
外部函数(Foreign Functions):PostgreSQL还支持使用外部函数来处理外部数据。外部函数是由外部数据包装程序提供的,可以在PostgreSQL中调用外部数据源中的函数,从而实现更复杂的操作和计算。
ostgreSQL支持使用外部函数,它允许您从PostgreSQL数据库中调用用其他编程语言编写的函数。这个特性使您能够通过利用其他语言提供的功能来扩展PostgreSQL的功能。
要在PostgreSQL中使用外部函数,需要创建一个语言扩展来定义要调用的函数。该扩展可以用C、c++或任何其他受支持的编程语言编写。
一旦创建并安装了扩展,您就可以通过在SQL语句中指定语言扩展和函数名来使用外部函数。然后PostgreSQL将执行相应的函数代码并返回结果。
当您需要执行复杂的计算或访问难以单独使用SQL实现的外部资源时,外部函数可能特别有用。它们允许您利用现有的代码和库,而不必用SQL重写它们。
注意,在使用外部函数时,需要确保数据库的安全性和完整性。确保检查和验证外部函数的代码,因为它们可能会引入安全漏洞或对数据库性能产生负面影响。
总的来说,外部函数通过集成用其他编程语言编写的代码,为扩展PostgreSQL的功能提供了强大的机制。它们允许您利用现有的库和代码库,从而更容易在数据库中实现复杂的功能。
PostgreSQL中的CREATE SERVER语句用于在数据库中创建一个新的外部服务器。
创建服务器的语法如下:
CREATE SERVER server_name
FOREIGN DATA WRAPPER wrapper_name
OPTIONS (option_name 'option_value', ...);
这里,server_name是外部服务器的名称,它在数据库中必须是唯一的。Wrapper_name是为外部数据源提供接口的外部数据包装器的名称。
还可以使用options子句为服务器指定其他选项。这些选项特定于所使用的外部数据包装器。每个选项都应该指定为option_name ‘option_value’。
例如,假设我们想要使用postgres_fdw包装器创建一个名为“my_server”的外部服务器。我们可以使用下面的查询:
CREATE SERVER my_server
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host 'localhost', dbname 'external_db', port '5432');
这将创建一个名为“my_server”的外部服务器,该服务器连接到本地运行的外部PostgreSQL数据库,名称为“external_db”,端口为5432。
请注意,为了使用postgres_fdw包装器,您需要在PostgreSQL数据库中安装并启用相应的扩展。
PostgreSQL CREATE USER MAPPING语句用于创建本地数据库用户和远程服务器用户之间的映射关系。它允许本地数据库中的用户使用不同的用户名和密码对远程对象进行身份验证和访问。
创建用户映射的语法如下:
CREATE USER MAPPING FOR local_user
SERVER remote_server
[ OPTIONS (option 'value', ...) ]
以下是对各种元素的解释:
下面是一个创建用户映射的例子:
CREATE USER MAPPING FOR john
SERVER remote_server
OPTIONS (user 'remote_user', password 'remote_password')
这将在本地数据库中为用户“john”创建一个用户映射,并将其映射到远程服务器中的用户“remote_user”。使用password选项指定远程用户的密码。
注意,为了创建用户映射,您需要在本地数据库和远程服务器上拥有适当的权限。
PostgreSQL IMPORT FOREIGN SCHEMA语句允许您从远程服务器导入外部表,并使它们在本地数据库中可用。
IMPORT FOREIGN SCHEMA语句的语法如下:
IMPORT FOREIGN SCHEMA foreign_schema_name
FROM foreign_server_name
INTO local_schema_name;
这里,foreign_schema_name是要导入的远程服务器上的模式名,foreign_server_name是前面使用CREATE server语句定义的外部服务器名,local_schema_name是要在其中创建外部表的本地模式名。
例如,假设您有一个名为my_foreign_server的外部服务器连接到远程Oracle数据库,并且您希望将Oracle数据库上的雇员模式中的所有表导入到本地PostgreSQL数据库的公共模式中。
导入外部模式的命令如下:
IMPORT FOREIGN SCHEMA employees
FROM my_foreign_server
INTO public;
执行此语句后,远程Oracle数据库中employees模式中的所有表将作为外表在本地PostgreSQL数据库的公共模式中可用。
注意,您需要拥有在数据库中创建外部表和定义外部服务器的适当权限。