当在 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;