ORA-01775错误与Oracle同义名(synonym)
使用synonym,以便于管理或者权限控制,但有时也会出现错误,需要特别注意。
今天我们的数据库就出现了错误:ORA-01775: 同义词的循环链
经过检查找到原因,原来同义名指向的表被删除了,所以报错。但在实际测试过程中,未能重现这个错误,删除表后,使用同义名时,只是提示“ORA-00980: 同义词转换不再有效
”,原因不明。
在检查的过程中,在网上查了资料,并进行了测试,找到了这个错误产生的主要原因,在这里记录下。
其实,导致ORA-01775: 同义词的循环链的原因很简单,主要有以下两点:
1,有循环定义的同义名。
2,实际的表或视图不存在。
测试过程如下:
第一种情况:有循环定义的同义名。
SQL> CONN SCOTT/ABC@HS01-60
已连接。SQL> CREATE TABLE SCOTT.TEST1
2 (ID INT,
3 NAME VARCHAR(10)
4 )
5 TABLESPACE USERS;表已创建。
SQL> INSERT INTO SCOTT.TEST1 VALUES (1,^AAA^);
已创建 1 行。
SQL> SELECT * FROM TEST1;
ID NAME
---------- ----------
1 AAA
SQL> CONN SCOTT/ABC@HS01-60
已连接。SQL> create or replace synonym t1 for scott.test1;
同义词已创建。
SQL> create or replace synonym t2 for t1;
同义词已创建。
SQL> select * from t1;
ID NAME
---------- ----------
1 AAASQL> create or replace synonym t1 for t2;
同义词已创建。
SQL> select * from t1;
select * from t1
*
ERROR 位于第 1 行:
ORA-01775: 同义词的循环链
---这时候我们查看一下实际存在的同义名:SQL> col owner format a10;
SQL> col synonym format a10;
SQL> col table_owner format a15;
SQL> col table_name format a10;SQL> select owner,synonym_name,table_owner,table_name from all_synonyms where synonym_name=^T1^ or synonym_name=^T2^;
OWNER SYNONYM_NAME TABLE_OWNER TABLE_NAME
---------- ------------------------------ --------------- ----------
SYSTEM T1 SYSTEM T2
SYSTEM T2 SYSTEM T1
这时候我们发现同义名T1,T2,只是互相关联,但并未关联到表Scott.test1上。(原因是我们创建时使用了replace,所以执行"create or replace synonym t1 for t2;",就将原来执行的"create or replace synonym t1 for scott.test1;"覆盖了)
但找不到实际的表,所以提示错误。
第二种情况示例:实际的表或视图不存在。
---首先删除已经建的同义名T1,T2
SQL> drop synonym t1;同义词已丢弃。
SQL> drop synonym t2;
同义词已丢弃。
SQL> select owner,synonym_name,table_owner,table_name from all_synonyms where synonym_name=^T1^ or synonym_name=^T2^;
未选定行
---重新创建同义名T1,关联到表Scott.test1
SQL> create or replace synonym t1 for scott.test1;同义词已创建。
SQL> select * from t1;
ID NAME
---------- ----------
1 AAA---删除表
SQL> drop table scott.test1;表已丢弃。
SQL> select * from t1;
select * from t1
*
ERROR 位于第 1 行:
ORA-00980: 同义词转换不再有效
这时候未提示"ORA-01775: 同义词的循环链",重启数据库后,提示依旧。原因不明。
值得注意的是同义名也有owner,创建同义名时如果不指定,就建在当前用户下。
如果指定为Public,则为公用同义名,只要有相关的权限,各个用户都可以使用的。
指定在特定非Public用户下时,别的用户使用时会提示错误:ORA-00942: 表或视图不存在。
示例如下:
SQL> conn system/manager@hs01-60;
已连接。SQL> select owner,synonym_name,table_owner,table_name from all_synonyms where sy
nonym_name=^T1^ or synonym_name=^T2^;未选定行
---创建system下的同义名
SQL> create or replace synonym t1 for scott.test1;同义词已创建。
---查看创建成功
SQL> select owner,synonym_name,table_owner,table_name from all_synonyms where sy
nonym_name=^T1^ or synonym_name=^T2^;OWNER SYNONYM_NAME TABLE_OWNER TABLE_NAME
---------- ------------------------------ --------------- ----------
SYSTEM T1 SCOTT TEST1SQL> conn scott/abc@hs01-60
已连接。
SQL> select * from t1;
select * from t1
*
ERROR 位于第 1 行:
ORA-00942: 表或视图不存在
Scott用户下无法使用system下的同义名,提示ORA-00942错误。
下面创建Public同义名,测试Scott用户下是否可以使用。
SQL> conn system/manager@hs01-60;
已连接。
SQL> drop synonym t1;同义词已丢弃。
SQL> select owner,synonym_name,table_owner,table_name from all_synonyms where sy
nonym_name=^T1^ or synonym_name=^T2^;未选定行
SQL> create or replace public synonym t1 for scott.test1;
同义词已创建。
SQL> conn scott/abc@hs01-60
已连接。
SQL> select * from t1;ID NAME
---------- ----------
1 AAA
可以发现,Scott用户下可以使用Public同义名,
Tag: Oracle技巧 TTTBLOG