12
外部数据
KingbaseES
实现了部分的
SQL/MED
规定,允许我们使用普通
SQL
查询来访问位于
KingbaseES
之外的数据。
这种数据被称为
外部数据
(注意这种用法不要和外键混淆,后者是数据库中的一种约束)。
外部数据可以在一个
外部数据包装器
的帮助下被访问。一个外部数据包装器是一个库,它可以与一个外部数据源通讯,并隐藏连接到数据源和从它获取数据的细节。其他类型的外部数据包装器可以在第三方产品中找
到。如果这些现有的外部数据包装器都不能满足你的需要,可以自己编写一个。
要访问外部数据,我们需要建立一个
外部服务器
对象,它根据它所支持的外部数据包装器所使用的一组选项
定义了如何连接到一个特定的外部数据源。接着我们需要创建一个或多个
外部表
,它们定义了外部数据的结构。一个外部表可以在查询中像一个普通表一样地使用,但是在 KingbaseES 服务器中外部表没有存储数据。
不管使用什么外部数据包装器,
KingbaseES
会要求外部数据包装器从外部数据源获取数据,或者在更新命令
的情况下传送数据到外部数据源。
访问远程数据可能需要在外部数据源的授权。这些信息通过一个
用户映射
提供,它基于当前的
KingbaseES
角色提供了附加的数据例如用户名和密码。
13
其他数据库对象
表是一个关系型数据库结构中的核心对象,因为它们承载了我们的数据。但是它们并不是数据库中的唯一一
种对象。有很多其他种类的对象可以被创建来使得数据的使用和刮泥更加方便或高效。在本章中不会讨论它
们,但是我们在会给出一个列表:
•
视图
•
函数、过程和操作符
•
数据类型和域
•
触发器和重写规则
14
依赖跟踪
当我们创建一个涉及到很多具有外键约束、视图、触发器、函数等的表的复杂数据库结构时,我们隐式地创
建了一张对象之间的依赖关系网。例如,具有一个外键约束的表依赖于它所引用的表。
为了保证整个数据库结构的完整性,
KingbaseES
确保我们无法删除仍然被其他对象依赖的对象。例如,尝试
删除
外键
中的产品表会导致一个如下的错误消息,因为有订单表依赖于产品表:
DROP TABLE products;
ERROR: cannot drop table products because other objects depend on it
DETAIL: constraint orders_product_no_fkey on table orders depends on table
products
HINT: Use DROP ... CASCADE to drop the dependent objects too.
该错误消息包含了一个有用的提示:如果我们不想一个一个去删除所有的依赖对象,我们可以执行:
DROP TABLE products CASCADE;
这样所有的依赖对象将被移除,同样依赖于它们的任何对象也会被递归删除。在这种情况下,订单表不会被
移除,但是它的外键约束会被移除。之所以在这里会停下,是因为没有什么依赖着外键约束(如果希望检查
DROP ... CASCADE
会干什么,运行不带
CASCADE
的
DROP
并阅读
DETAIL
输出)。
KingbaseES
中的几乎所有
DROP
命令都支持
CASCADE
。当然,其本质的区别随着对象的类型而不同。我们
也可以用
RESTRICT
代替
CASCADE
来获得默认行为,它将阻止删除任何被其他对象依赖的对象。
Note:
根据
SQL
标准,在
DROP
命令中指定
RESTRICT
或
CASCADE
是被要求的。但没有哪个数据库系统
真正强制了这个规则,但是不同的系统中两种默认行为都是可能的。
如果一个
DROP
命令列出了多个对象,只有在存在指定对象构成的组之外的依赖关系时才需要
CASCADE
。
例如,如果发出命令
DROP TABLE tab1, tab2
且存在从
tab2
到
tab1
的外键引用,那么就不需要
CASCADE
即可成功执行。
对于用户定义的函数,
KingbaseES
会追踪与函数外部可见性质相关的依赖性,例如它的参数和结果类型,但
不追踪检查函数体才能知道的依赖性。例如,考虑这种情况:
CREATE TYPE rainbow AS ENUM (
'red'
,
'orange'
,
'yellow'
,
'green'
,
'blue'
,
'purple'
);
CREATE TABLE my_colors (color rainbow, note text);
CREATE FUNCTION get_color_note (rainbow) RETURNS text AS
'SELECT note FROM my_colors WHERE color = $1'
LANGUAGE SQL;
(
SQL
元函数的解释见
查询语言函数
)。
KingbaseES
将会注意到
get_color_note
函数依赖于
rainbow
类型:删掉该类型会强制删除该函数,因为该函数的参数类型就无法定义了。但是
KingbaseES
不会认为
get_color_note
依赖于
my_colors
表,因此即使该表被删除也不会删除这个函数。虽然这种方法有缺
点,但是也有好处。如果该表丢失,这个函数在某种程度上仍然是有效的,但是执行它会导致错误。创建一
个同名的新表将允许该函数重新有效。