跳到主要内容

在外部数据库中访问和修改数据

本部分总结访问不在当前数据库中的表和例程。

访问其他数据库服务器

通过限定数据库对象(表、视图、同义词或例程)的名称,您可访问外部数据库中的任何表或例程。

当外部表与当前数据库位于同一数据库服务器上时,您必须以数据库名称和冒号限定对象名称。例如,要引用不是本地数据库的数据库中的表,下列 SELECT 语句访问来自外部数据库的信息:

SELECT name, number FROM salesdb:contacts

在此示例中,查询从表 contacts 返回数据,该表在数据库 salesdb 中。

远程数据库服务器是不是当前数据库服务器的任何数据库服务器。当外部表在远程数据库服务器上时,您必须以数据库服务器名称和数据库名称来限定数据库对象的名称,如下例所示:

SELECT name, number FROM salesdb@distantserver:contacts

在此示例中,查询从表 contacts 返回数据,该表在远程数据库服务器 distantserver 上的数据库 salesdb 中。

要了解关于如何在外部数据库中指定数据库对象的语法和规则,请参阅《GBase 8s SQL 指南:语法》。

访问 ANSI 数据库

在 ANSI 数据库中,对象的所有者是对象名称的一部分: ownername.objectname。当当前数据库和外部数据库都是 ANSI 数据库时, 除非您是该对象的所有者,否则您必须包括所有者名称。 下列 SELECT 语句展示完全限定的表名称:

SELECT name, number FROM salesdb@aserver:ownername.contacts
提示

您始终可“超限定”对象名。即,您可指定完全的对象名称,database@servername:ownername.objectname,即使在您不需要完全的对象名称的情况下。

在外部数据库服务器之间创建连接

您可在连接中使用相同的表示法。当您显式地指定数据库名称时,长的表名称可能会比较累赘,除非您使用别名来缩短它们,如下例所示:

SELECT O.order_num, C.fname, C.lname
FROM masterdb@central:customer C, sales@boston:orders O
WHERE C.customer_num = O.Customer_num

访问外部例程

要引用不是当前数据库服务器的数据库服务器上的例程,请以数据库服务器名称和数据库名称(以及所有者名称,如果远程数据库符合 ANSI 的话)来限定例程名称,如下列 SELECT 语句所示:

SELECT name, salesdb@boston:how_long()
FROM salesdb@boston:contacts

对于远程数据库访问的限制

本部分总结对远程数据库访问的限制。

访问多个数据库的 SQL 语句

您可跨数据库和跨数据库服务器实例运行下列 SQL 语句:

  • CREATE DATABASE
  • CREATE SYNONYM
  • CREATE VIEW
  • DATABASE
  • DELETE
  • DROP DATABASE
  • EXECUTE FUNCTION
  • EXECUTE PROCEDURE
  • INFO
  • INSERT
  • LOAD
  • LOCK TABLE
  • MERGE
  • SELECT
  • UNLOAD
  • UNLOCK TABLE
  • UPDATE
限制

要跨数据库或跨数据库服务器成功地运行这些 SQL 语句中的每一个,本地数据库与外部数据库必须都具有相同的日志记录模式。例如,如果作为 MODE ANSI 创建了您从其发出分布式查询的本地数据库,该查询访问的其他数据库都不可为无日志记录的,且不可使用显式的事务。

在跨数据库操作中返回数据类型

使用 SQL 语句或 UDR 来访问本地 GBase 8s 数据库服务器实例的其他数据库的分布式操作可访问这些数据类型的值:

  • 非 opaque 的任何内建的原子数据类型
  • BLOB、BOOLEAN、BSON、CLOB、JSON 和 LVARCHAR opaque 类型
  • 基于内建的类型的 DISTINCT 类型
  • 可强制转型为内建的类型的用户定义的数据类型(UDT)。

必须将上述 DISTINCT 或 UDT 值都显式地强制转型为内建的数据类型,且必须在所有参与的数据库中定义所有 DISTINCT 类型、UDT 和强制转型。

它们还可访问可强制转型为内建的类型的 UDT,假设显式地将 DISTINCT 或 UDT 值强制转型为内建的类型,以及在所有参与的数据库中定义的所有 DISTINCT 类型、UDT 和强制转型。

如果在所有参与的数据库中定义 UDR,则 SPL、C 和 Java 语言 UDR 可返回这些数据类型作为参数或作为返回值。必须跨所有参与的 GBase 8s 实例,来复制在这些数据类型之上定义的任何隐式的或显式的强制转型。DISTINCT 数据类型必须具有与在分布式查询中参与的所有数据库中定义的完全相同的数据类型层级结构。

跨数据库的分布式查询或其他访问本地 GBase 8s 数据库服务器的另一数据库的跨数据库 DML 操作将会失败并报错,如果它引用包括任何下列数据类型的列的表、视图或同义词的话:

  • IMPEX
  • IMPEXBIN
  • LOLIST
  • SENDRECV
  • 以上列出的任何内建的 opaque 数据类型的 DISTINCT
  • 复合的类型,包括 COLLECTION、LIST、MULTISET 或 SET,以及命名了的或未命名的 ROW 类型。

对于以这些内建的 opaque 或复合的数据类型访问表的跨数据库分布式操作的这一限制,也适用于访问两个或多个数据库服务器实例的数据库的操作,这在下一部分描述。

在跨服务器操作中的返回数据类型

跨两个或多个 GBase 8s 实例的分布式查询(或任何其他分布式 DML 操作或函数调用)不可返回复合的或大对象数据类型,也不可返回大部分 UDT 或 opaque 数据类型。跨服务器分布式查询、DML 操作和函数调用仅可返回下列数据类型:

  • 任何非 opaque 的内建数据类型
  • BOOLEAN
  • BSON
  • JSON
  • LVARCHAR
  • 非 opaque 的内建类型的 DISTINCT
  • BOOLEAN 或 LVARCHAR 的 DISTINCT
  • BSON 或 JSON 的 DISTINCT
  • 在此列表中出现在上面的任何 DISTINCT 类型的 DISTINCT。

同样的跨数据库要求也适用于跨两个或多个 GBase 8s 数据库服务器实例的数据库的分布式 SQL 操作,即,在每个参与的数据库中,所有 UDR、强制转型和 DISTINCT 数据类型都要有相同的定义。

访问另一 GBase 8s 实例的数据库的跨服务器 DML 操作将会失败并报错。然而,如果它引用包括任意下列数据类型的表对象:

  • BLOB
  • CLIENTBINVAL
  • CLOB
  • IFX_LO_SPEC
  • IFX_LO_STAT
  • INDEXKEYARRAY
  • POINTER
  • RTNPARAMTYPES
  • SELFUNCARGS
  • STAT
  • 用户定义的 OPAQUE 类型
  • 罗列在上面的任何内建的 opaque 数据类型的 DISTINCT
  • 复合的类型,包括 COLLECTION、LIST、MULTISET 或 SET,以及命名了的或未命名的 ROW 类型。

访问外部数据库对象

要访问外部数据库对象:

  • 您必须持有对这些对象的适当的访问许可。
  • 必须将两个数据库都设置为相同的语言环境。
重要

分布式事务不可访问另一 GBase 8s 服务器实例的数据库中的对象,除非两个服务器实例都支持 TCP/IP 连接或 IPCSTR 连接,如同在它们的 DBSERVERNAME 或 DBSERVERALIASES 配置参数中以及在 sqlhosts 信息中定义的那样。此连接类型要求应用于 GBase 8s 数据库服务器实例之间的任何通信,即使两个数据库服务器都驻留在同一计算机上。