同义词是一个标识符,可在 SQL 语句中用于引用其他数据库对象。在数据库对象通常需要按 schema 名称进行完全限定才能在 SQL 语句中正确引用的情况下,同义词十分有用。为该对象定义的同义词简化了对单个非限定名称的引用。

PolarDB PostgreSQL版(兼容Oracle)支持以下对象的同义词:

  • 视图
  • 具体化视图
  • 序列
  • 过程
  • 函数
  • 类型
  • 可通过 database link 访问的对象
  • 其他同义词

创建同义词时,引用的 schema 或引用的对象不必非得存在;同义词可引用不存在的对象或 schema。如果您删除引用的对象或 schema,同义词将变得无效。您必须显式删除同义词才能将其移除。

与任何其他 schema 对象一样,PolarDB PostgreSQL版(兼容Oracle)使用搜索路径来解析非限定的同义词名称。如果您有两个同名的同义词,则对同义词的非限定引用将解析为搜索路径中具有给定名称的第一个同义词。如果 public 位于搜索路径中,您可以引用该 schema 中的同义词而无需限定该名称。

PolarDB PostgreSQL版(兼容Oracle)执行 SQL 命令时,将根据同义词的基础数据库对象检查当前用户的特权;如果用户没有该对象的适当权限,SQL 命令将失败。

创建同义词

使用 CREATESYNONYM 命令创建同义词。语法如下:

CREATE [OR REPLACE] [PUBLIC] SYNONYM [schema.]syn_name
       FOR object_schema.object_name[@dblink_name];
表 1. 参数
参数说明
syn_namesyn_name 是同义词的名称。同义词名称在 schema 中必须是唯一的。
schemaschema 指定同义词所在 schema 的名称。如果未指定 schema 名称,则在搜索路径中的第一个现有 schema 中创建同义词。
object_nameObject_name 指定对象的名称。
object_schemaObject_schema 指定对象所在的 schema 的名称。
dblink_nameDblink_name 指定可通过其访问目标对象的 database link 的名称。

包括 REPLACE 子句,以将现有同义词定义替换为新的同义词定义。

包括 PUBLIC 子句,以在 public schema 中创建同义词。与 Oracle 数据库兼容的 CREATE PUBLIC SYNONYM 命令会创建一个位于 public schema 中的同义词:

CREATE [OR REPLACE] PUBLIC SYNONYM syn_name FOR object_schema.object_name;

以下只是一种简写方式:

CREATE [OR REPLACE] SYNONYM public.syn_name FOR object_schema.object_name;

以下示例创建一个名为 personnel 的同义词,它引用 polardb.emp 表。

CREATE SYNONYM personnel FOR polardb.emp;

除非同义词在 CREATE SYNONYM 命令中是 schema 限定的,否则将在搜索路径的第一个现有 schema 中创建它。您可以通过执行以下命令,查看搜索路径:

SHOW SEARCH_PATH;

      search_path
-----------------------
 development,accounting
(1 row)

在此示例中,如果名为 development 的 schema 不存在,则将在名为 accounting 的 schema 中创建同义词。

现在,通过使用同义词 personnel,可在任何 SQL 语句(DDL 或 DML)中引用 polardb schema 中的 emp 表:

INSERT INTO personnel VALUES (8142,'ANDERSON','CLERK',7902,'17-DEC-06',1300,NULL,20);

SELECT * FROM personnel;

 empno |  ename   |    job    | mgr  |      hiredate      |   sal   |  comm   | deptno
-------+----------+-----------+------+--------------------+---------+---------+--------
  7369 | SMITH    | CLERK     | 7902 | 17-DEC-80 00:00:00 |  800.00 |         |     20
  7499 | ALLEN    | SALESMAN  | 7698 | 20-FEB-81 00:00:00 | 1600.00 |  300.00 |     30
  7521 | WARD     | SALESMAN  | 7698 | 22-FEB-81 00:00:00 | 1250.00 |  500.00 |     30
  7566 | JONES    | MANAGER   | 7839 | 02-APR-81 00:00:00 | 2975.00 |         |     20
  7654 | MARTIN   | SALESMAN  | 7698 | 28-SEP-81 00:00:00 | 1250.00 | 1400.00 |     30
  7698 | BLAKE    | MANAGER   | 7839 | 01-MAY-81 00:00:00 | 2850.00 |         |     30
  7782 | CLARK    | MANAGER   | 7839 | 09-JUN-81 00:00:00 | 2450.00 |         |     10
  7788 | SCOTT    | ANALYST   | 7566 | 19-APR-87 00:00:00 | 3000.00 |         |     20
  7839 | KING     | PRESIDENT |      | 17-NOV-81 00:00:00 | 5000.00 |         |     10
  7844 | TURNER   | SALESMAN  | 7698 | 08-SEP-81 00:00:00 | 1500.00 |    0.00 |     30
  7876 | ADAMS    | CLERK     | 7788 | 23-MAY-87 00:00:00 | 1100.00 |         |     20
  7900 | JAMES    | CLERK     | 7698 | 03-DEC-81 00:00:00 |  950.00 |         |     30
  7902 | FORD     | ANALYST   | 7566 | 03-DEC-81 00:00:00 | 3000.00 |         |     20
  7934 | MILLER   | CLERK     | 7782 | 23-JAN-82 00:00:00 | 1300.00 |         |     10
  8142 | ANDERSON | CLERK     | 7902 | 17-DEC-06 00:00:00 | 1300.00 |         |     20
(15 rows)

删除同义词

要删除同义词,请使用命令 DROP SYNONYM。语法如下:

DROP [PUBLIC] SYNONYM [schema.]syn_name
表 2. 参数
参数说明
syn_namesyn_name 是同义词的名称。同义词名称在 schema 中必须是唯一的。
schemaschema 指定同义词所在的 schema 的名称。

与可由 schema 限定的任何其他对象一样,您可在搜索路径中包含两个同名的同义词。为区别您要删除的同义词的名称,请包含 schema 名称。除非在 DROP SYNONYM 命令中使用 schema 限定同义词,否则PolarDB PostgreSQL版(兼容Oracle)会删除在搜索路径中找到的第一个同义词实例。

您可以选择包含 PUBLIC 子句以删除 public schema 中的同义词。与 Oracle 数据库兼容的 DROP PUBLIC SYNONYM 命令会删除位于 public schema 中的同义词:

DROP PUBLIC SYNONYM syn_name;

以下示例会删除同义词 personnel:

DROP SYNONYM personnel;