同义词是一个标识符,可在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_name

syn_name是同义词的名称。同义词名称在schema中必须是唯一的。

schema

schema指定同义词所在schema的名称。如果未指定schema名称,则在搜索路径中的第一个现有schema中创建同义词。

object_name

Object_name指定对象的名称。

object_schema

Object_schema指定对象所在的schema的名称。

dblink_name

Dblink_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_name

syn_name是同义词的名称。同义词名称在schema中必须是唯一的。

schema

schema指定同义词所在的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;