当在 SQL 语句中引用对象时,OceanBase 会考虑 SQL 语句的上下文并在适当的名称空间中找到该对象。找到对象后,OceanBase 执行 SQL 语句对该对象指定的操作。如果在适当的名称空间中找不到命名的对象,则返回错误。
引用用户的 Schema 中的对象
以下示例说明了 OceanBase 如何解析 SQL 语句中对象的引用。
执行以下语句,向名为 departments 的表中添加了一行数据:
INSERT INTO departments
VALUES (280, 'ENTERTAINMENT_CLERK', 206, 1700);
根据 SQL 语句的上下文,departments 在数据库中可能是:
- 一张在您自己 Schema 中的表
- 一个在您自己 Schema 中的视图
- 一个表或视图的专有同义词
- 一个公共同义词
OceanBase 始终会先尝试在您自己的 Schema 中的名称空间里解析被引用对象,然后再考虑该 Schema 之外的名称空间。在此示例中,OceanBase 尝试解析如下:
- 首先,OceanBase 尝试在您自己的包含了表、视图和专用同义词的 Schema 中的名称空间里去定位对象。如果对象是专用同义词,则 OceanBase 会找到该同义词所代表的对象。该对象可以在您自己的 Schema 中,也可以在其他 Schema 中或者在另一个数据库中。该对象也可以是其他的同义词,在这种情况下,OceanBase 会找到同义词所代表的对象。
- 如果对象在名称空间中被找到,则 OceanBase 尝试对该对象执行 SQL 语句。在此示例中,OceanBase 尝试将一行数据添加到 departments 中。如果此对象的类型不是该 SQL 语句所需要的类型,则 OceanBase 返回错误。在此示例中,departments 必须是表、视图或者可以是可以解析为表或视图的专用同义词。如果 departments 是序列,则 OceanBase 返回错误。
- 如果该对象到目前为止没有在任何名称空间中被搜索到,则 OceanBase 将搜索包含公共同义词的名称空间。如果对象在包含公共同义词的名称空间中,则 OceanBase 尝试对该对象执行该语句。如果此对象的类型不是该 SQL 语句所需要的类型,则 OceanBase 返回错误,例如在此示例中,如果 departments 是一个代表了序列的公共同义词,那么 OceanBase 将返回错误。
如果公共同义词包含任何依赖表或用户定义类型,则不能在与依赖对象相同的 Schema 中创建与同义词同名的对象。
反之,如果同义词没有任何依赖表或用户定义的类型,则可以在与依赖对象相同的 Schema 中创建具有相同名称的对象。OceanBase 会使所有依赖对象无效,并在下一次访问它们时重新验证它们。
引用其他 Schema 中的对象
要引用您的 Schema 之外的 Schema 中的对象,需要在对象名称前添加 Schema 名称:
schema.object
例如,以下示例展示了在名为 hr 的 Schema 中删除表 employees:
DROP TABLE hr.employees;