Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


同义词

📄字数 2.6K
👁️阅读量 加载中...

同义词(synonym)是表、视图、序列等数据库对象的一个别名,用户可通过同义词引用原始对象。同义词核心作用是简化对象访问、提高代码可维护性。同义词分为公共同义词(当前库下所有用户均可使用)与私有同义词(对象属主或拥有权限访问的用户可用)。同义词可以在能够获取到对象信息的ddl、dml等操作中使用。

一、创建同义词

1.1 语法格式

1.2 参数说明

  • OR REPLACE:可选关键字,指定同义词存在则替换,用于更新同义词定义。
  • PUBLIC:同义词属性,表示同义词为公共同义词。
  • schema_syn_name:指定私有同义词的属主模式,未指定时为当前模式,公共同义词不可指定属主模式。
  • syn_name:同义词名称,名称必须满足数据库对象命名规则中列出的要求。
  • schema_obj_name:指定目标对象的模式,未指定则是当前模式。
  • object_name:同义词引用的原始对象名称,支持除触发器外的所有类型,包括自定义类型。也可以是另一个同义词(支持别名链)。

注意

  • 系统不支持为触发器创建同义词。
  • 同义词名称不能与数据库已存在的对象名称相同。
  • 用户使用同义词之前,必须保证对同义词引用的对象具有读取权限。
  • 私有同义词的权限和公共同义词权限不相同,需要分开赋予。具体请参考 权限管理

1.3 示例

  • 示例1

    为过长的表名创建同义词。

    sql
    -- 创建表名过长
    SQL> CREATE TABLE tab_name_long_long_long (col_1 int);
    
    SQL> INSERT INTO tab_name_long_long_long VALUES(1),(2);
    
    SQL> SELECT * FROM tab_name_long_long_long;
    +-------+
    | COL_1 |
    +-------+
    | 1     |
    | 2     |
    +-------+
    
    -- 创建同义词,访问表
    SQL> CREATE SYNONYM syn_tab FOR tab_name_long_long_long;
    
    SQL> SELECT * FROM syn_tab;
    +-------+
    | COL_1 |
    +-------+
    | 1     |
    | 2     |
    +-------+
    
    -- 查询同义词信息
    SQL> select syno_name,targ_name,is_public,valid,create_time from ALL_SYNONYMS where syno_name = 'syn_tab';
    
    +-----------+-------------------------+-----------+-------+--------------------------+
    | SYNO_NAME |        TARG_NAME        | IS_PUBLIC | VALID |       CREATE_TIME        |
    +-----------+-------------------------+-----------+-------+--------------------------+
    | SYN_TAB   | TAB_NAME_LONG_LONG_LONG | F         | T     | 2025-07-23 11:22:02.924  |
    +-----------+-------------------------+-----------+-------+--------------------------+
  • 示例2

    创建公共同义词,不同用户都可以访问。

    sql
    -- 创建普通用户
    SQL> SET SESSION AUTHORIZATION sysdba;
    
    SQL> CREATE USER syn_user1 IDENTIFIED BY 'PASS_123';
    
    SQL> CREATE TABLE syn_user1.synonym_table2(a INT,b VARCHAR);
    
    SQL> SET SESSION AUTHORIZATION syn_user1;
    
    -- 没有创建私有同义词和公共同义词的权限
    SQL> CREATE SYNONYM syn_tb2 FOR synonym_table2;
    Error: [E18012] 权限不够
    
    SQL> CREATE PUBLIC SYNONYM syn_pub_tb2 FOR synonym_table2;
    Error: [E18012] 权限不够
    
    -- 赋予公共同义词权限
    SQL> SET SESSION AUTHORIZATION sysdba;
    
    SQL> GRANT CREATE PUBLIC SYNONYM TO syn_user1;
    
    -- syn_user1创建公共同义词
    SQL> SET SESSION AUTHORIZATION syn_user1;
    
    SQL> CREATE PUBLIC SYNONYM syn_pub_tb2 FOR synonym_table2;
    
    SQL> SELECT * FROM syn_pub_tb2;
    +---+---+
    | A | B |
    +---+---+
    
    SQL> CREATE SYNONYM syn_tb2 FOR synonym_table2;
    Error: [E18012] 权限不够
    
    -- sysdba访问其他用户创建的公共同义词
    SQL> SET SESSION AUTHORIZATION sysdba;
    
    SQL> SELECT * FROM syn_pub_tb2;
    +---+---+
    | A | B |
    +---+---+
  • 示例3

    系统不支持为触发器创建同义词。

    sql
    SQL> CREATE TRIGGER trg_1 BEFORE INSERT
         ON tab_name_long_long_long FOR EACH ROW
         BEGIN
           INSERT INTO tab_name_long_long_long VALUES(99);
         END;
         /
    
    SQL> CREATE SYNONYM syn_trg FOR trg_1;
    Error: [E19067] 系统不支持的操作

二、更改同义词

2.1 语法格式

语法格式在第一章节创建同义词中已说明,指定OR REPLACE参数即可。

2.2 示例

  • 示例1

    更改已有同义词。

    sql
    -- 建表
    SQL> CREATE TABLE tab_1(col_1 int);
    
    SQL> INSERT INTO tab_1 VALUES(1),(2);
    
    SQL> CREATE TABLE tab_2(col_1 int);
    
    SQL> INSERT INTO tab_2 VALUES(3),(4);
    
    -- 创建同义词
    SQL> CREATE SYNONYM syn_tab1 FOR tab_1;
    
    SQL> SELECT * FROM syn_tab1;
    +-------+
    | COL_1 |
    +-------+
    | 1     |
    | 2     |
    +-------+
    
    -- 更改同义词
    SQL> CREATE OR REPLACE  SYNONYM syn_tab1 FOR tab_2;
    
    SQL> SELECT * FROM syn_tab1;
    +-------+
    | COL_1 |
    +-------+
    | 3     |
    | 4     |
    +-------+
  • 示例2

    同义词不存在,则新建。

    sql
    -- 建表
    SQL> CREATE TABLE tab_3(col_1 int);
    
    SQL> INSERT INTO tab_3 VALUES(5),(6);
    
    -- 创建同义词
    SQL> CREATE OR REPLACE SYNONYM syn_tab3 FOR tab_3;
    
    SQL> SELECT * FROM syn_tab3;
    +-------+
    | COL_1 |
    +-------+
    | 5     |
    | 6     |
    +-------+

三、删除同义词

需重新定义同义词或者同义词不再使用时可以删除同义词。

3.1 语法格式

3.2 参数说明

  • PUBLIC:删除公共同义词。
  • schema_syn_name:指定私有同义词的属主模式,未指定时为当前模式,公共同义词不可指定属主模式。
  • syn_name:同义词名称。

注意

  • 删除同义词需要在同义词所属的模式和库下进行,否则无法删除。
  • 给同义词1创建一个同义词2,依然可以删除同义词1,此时同义词2也会一起被删除。
  • 同义词可以被依赖,但因为它只是对象的一个别名,真实依赖的还是同义词指向的源对象,被依赖时删除同义词依然能够成功,依赖关系依然存在并且有效,不受删除同义词影响。

3.3 示例

  • 删除同义词 syn_tab3

    sql
    SQL> DROP SYNONYM syn_tab3;