插入 Oracle 同义词

Sam*_*tag -2 database oracle synonym

如果我有另一个 Schema 的表的 Synonym,我可以在 Synonym 中插入内容吗?如果是的话,是否也会影响原来的表呢?

Ale*_*sej 5

同义词不是“真正的”对象,而只是指向对象的指针;因此,无论您对同义词执行什么操作,您都是对引用的对象执行操作。

您可以通过显式写入架构来访问不同架构中的表:

SQL> select count(1) from sys.sys_table;

  COUNT(1)
----------
         0

SQL> select count(1) from sys_table;
select count(1) from sys_table
                     *
ERROR at line 1:
ORA-00942: table or view does not exist
Run Code Online (Sandbox Code Playgroud)

创建同义词

SQL> create synonym my_synonym for sys.sys_table;

Synonym created.
Run Code Online (Sandbox Code Playgroud)

然后您可以使用同义词来访问该表:

SQL> select count(1) from my_synonym;

  COUNT(1)
----------
         0
Run Code Online (Sandbox Code Playgroud)

但您仍然无法直接访问该表:

SQL> select count(1) from sys_table;
select count(1) from sys_table
                     *
ERROR at line 1:
ORA-00942: table or view does not exist
Run Code Online (Sandbox Code Playgroud)

您可以使用同义词插入表中

SQL> insert into my_synonym values (1);

1 row created.
Run Code Online (Sandbox Code Playgroud)

...或使用schema.table

SQL> insert into sys.sys_table values (2);

1 row created.
Run Code Online (Sandbox Code Playgroud)

不管你怎么做,所有的行都会被插入:

SQL> select count(1) from sys.sys_table;

  COUNT(1)
----------
         2

SQL> select count(1) from my_synonym;

  COUNT(1)
----------
         2
Run Code Online (Sandbox Code Playgroud)

如果你删除同义词

SQL> drop synonym my_synonym;

Synonym dropped.
Run Code Online (Sandbox Code Playgroud)

需要使用schema.table,数据和表仍然保留:

SQL> select count(1) from sys.sys_table;

  COUNT(1)
----------
         2
Run Code Online (Sandbox Code Playgroud)

但是,当然,您不能再使用同义词

SQL> select count(1) from my_synonym;

    select count(1) from my_synonym
                         *
    ERROR at line 1:
    ORA-00942: table or view does not exist
Run Code Online (Sandbox Code Playgroud)