昨天在qq群里看到有人在问同义词的循环链的问题,一时感兴趣,就分析了下。

顾名思义,就是同义词A指向同义词B,而同义词B又指向同义词A,导致死循环。

(1)下面先看一下如何导致同义词的循环链。

以scott用户登录测试库,依次执行下面的代码:

create table t1 (id number,name varchar2(32));
create table t2 (id number,name varchar2(32));
insert into t1 values (1,'t1');
insert into t2 values (2,'t2');
commit;
create public synonym t1 for t2;
create public synonym t2 for t1;
drop table t1;
drop table t2;

--执行下面的语句就会报错:同义词的循环链

SQL> select * from t1;
select * from t1
ORA-01775: 同义词的循环链

SQL> select * from t2;
select * from t2
ORA-01775: 同义词的循环链

(2)分析如何导致上面的错误

首先要知道oracle查找一个对象的步骤:

1、先在自己的对象(user_objects)中查找,若找到,则使用该对象

2、若找不到,则在用户的私有同义词中查找该对象,若找到,则使用该对象

3、若找不到,则在公共同义词里找,若找到,则使用该同义词,若找不到,则报错。

上面的select * from t1会导致oracle在user_objects里查找object_name=t1的对象,发现找不到,接着,oracle会在user_synonyms里查询synonym_name=t1的私有同义词,发现找不到, oracle会接着在dba_synonyms里查找owner=public and SYNONYM_NAME=t1的同义词,发现找到了,然后oracle将上面的sql语句转换为:select * from scott.t2 。然后oracle跑到scott方案里查找object_name=t2

的对象,发现没有,接着,oracle会在user_synonyms里查询synonym_name=t2的私有同义词,发现找不到,接着,oracle又到public synonyms里查找synonym_name=t2的同义词,发现找到了,然后oracle将上面的sql语句转换为:select * from scott.t1。

。。。。。。就这样,无限死循环了,所以oracle报错:同义词的循环链。

同理,下面的select * from t2;原理也是一样的。

昨天在qq群里看到有人在问同义词的循环链的问题,一时感兴趣,就分析了下。顾名思义,就是同义词A指向同义词B,而同义词B又指向同义词A,导致死循环。(1)下面先看一下如何导致同义词的循环链。以scott用户登录测试库,依次执行下面的代码:create table t1 (id number,name varchar2(32));create table t2 (id number
今天刚学习 Oracle 数据库, 学习了创建表、视图、 同义词 、序列、 循环 、判定的基本使用,将今天的完成的作业与大家分享参考一下,如有不足,请批评指正,谢谢了!!! – 创建雇员表 create table emp( empno numeric(4) primary key not null,-- 雇员编号 ename varchar2(10),-- 雇员姓名 job varchar2(9),-- 工...
Oracle 同义词 是任何表、视图、物化视图、序列、存储过程、函数、包、类型、JAVA类对象、用户定义类型,或是其他的 同义词 的别名。由于其只是一个别名,所以除了在数据字典中的定义不占任何空间。 同义词 常用于安全和方便。例如,它们可以做: 1.伪装对象名称和其所有者。 2.为分布式数据库远程对象提供位置透明性 3.简化数据库用户访问对象SQL语句 4.当行使精细化访问控制时提供类似指定视...
公司服务器周末要加硬盘,周一来后应用连不上了。报错如下 报错: ORA -12170:TNS connect timeout occurred 第一反应是监听没开: 1. 测试了一下, 连接超时没用ping 通 C:\Users\Administrator>tnsping brorcl TNS Ping Utility for 64-bit Windows: Version 11.2.0.1.0 – Production on 15-6月 -2015 09:45:43 已使用的参数文件
ORA -32001:write to spfile requested but no spfile is in use请求写入spfile,但没有使用spfile的解决方法 在输入以下语句中报了这样的错误: SQL>alter system set control_files=’/u01/app/ oracle / ora data/prod/ ora _control1.ctl’,’/u01/app/ oracle / ora data/prod/ ora _control2.ctl’ scope=spfile; 解决方法: 1.show parameter spfile; 这时候可以看到spfile的valu
SQL> select* from dba_synonyms  where table_owner='t1'; OWNER                          SYNONYM_NAME                   TABLE_OWNER                    TABLE_NAME                     DB_LINK -------
ORA -01261和 ORA -01262是 Oracle 数据库中的错误代码,通常与控制文件相关。 ORA -01261表示控制文件中的记录已经过时,无法使用。这可能是由于控制文件已经被删除或损坏,或者是由于数据库实例无法访问控制文件。 ORA -01262表示控制文件中的记录已经被修改,无法使用。这可能是由于控制文件已经被其他进程修改,或者是由于数据库实例无法访问控制文件。 要解决这些错误,可以尝试恢复控制文件,或者使用备份控制文件替换当前的控制文件。还可以检查数据库实例的权限和文件系统的可用空间,以确保数据库实例可以访问控制文件。