ORACLE公有/私有同义词(四)

2014-11-24 14:40:40 · 作者: · 浏览: 2
AME like 'TEST%';
OWNER SYNONYM_NAME TABLE_OWNER TABLE_NAME DB_LINK
---------- ------------------------------ ------------------------------ ---------- ----------
PUBLIC TEST BYS DEPT
TEST TEST1 SCOTT DEPT
BYS@bys1>select * from cat;
TABLE_NAME TABLE_TYPE
---------- -----------
DEPT TABLE
EMP TABLE
SEQ1 SEQUENCE
SYS_TEMP_F TABLE
BT
7.编译同义词
当同义词的原对象被重新建立时,同义词需要重新编译--此编译操作需要SYSDBA权限,DBA用户执行报错。
BYS@bys1>alter synonym test.test1 compile;
alter synonym test.test1 compile
*
ERROR at line 1:
ORA-01031: insufficient privileges
BYS@bys1>conn / as sysdba
Connected.
SYS@bys1>alter synonym test.test1 compile;
Synonym altered.
对原对象进行DDL操作后,同义词的状态会变成INVALID;当再次引用这个同义词时,同义词会自动编译,状态会变成VALID,无需人工干预,当然前提是不改变原对象的名称
BYS@bys1>create synonym test for dept;
Synonym created.
BYS@bys1>select object_name,object_type,status from user_objects where object_name='DEPT' or object_name='TEST';
OBJECT_NAME OBJECT_TYPE STATUS
-------------------- ------------------- -------
DEPT TABLE VALID
TEST SYNONYM VALID
BYS@bys1>select object_name,object_type,status from user_objects where object_name='DEPT' or object_name='TEST';
OBJECT_NAME OBJECT_TYPE STATUS
-------------------- ------------------- -------
DEPT TABLE VALID
TEST SYNONYM VALID
BYS@bys1>drop table dept; 删除同义词对应的对象
Table dropped.
BYS@bys1>select object_name,object_type,status from user_objects where object_name='DEPT' or object_name='TEST';
OBJECT_NAME OBJECT_TYPE STATUS
-------------------- ------------------- -------
TEST SYNONYM INVALID -----此时同义词的状态已经为INVALID
BYS@bys1>select * from test; 此时查询同义词时会报错:同义词的状态不是有效的。
select * from test
*
ERROR at line 1:
ORA-00980: synonym translation is no longer valid
BYS@bys1>flashback table dept to before drop;
Flashback complete.
闪回删除的表后,查看对象状态,表已经是VALID,同义词仍是INVALID。
BYS@bys1>select object_name,object_type,status from user_objects where object_name='DEPT' or object_name='TEST';
OBJECT_NAME OBJECT_TYPE STATUS
-------------------- ------------------- -------
DEPT TABLE VALID
TEST SYNONYM INVALID
BYS@bys1>select * from test;
DEPTNO DNAME LOC
---------- -------------- --------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
此时使用同义词进行一次查询后,同义词状态自动变为可用。
BYS@bys1>select object_name,object_type,status from user_objects where object_name='DEPT' or object_name='TEST';
OBJECT_NAME OBJECT_TYPE STATUS
-------------------- ------------------- -------
DEPT TABLE VALID
TEST SYNONYM VALID
常见问题三例:
1:公用同义词与私有同义词能否同名呢?如果可以,访问同义词时,是共有同义词还是私有同义词优先?
可以,如果存在公用同义词和私有同义词同名的情况,在访问同义词是,访问的是私有同义词的指向的对象。
2:为什么OE用户创建的公用同义词,HR用户不能访问呢?
因为HR没有访问OE模式下对象的权限,如果OE模式给HR用户赋予了SELECT对象等权限,那么HR用户即可访问。
3:对象、私有同义词、公共同义词是否可以存在三者同名的情况?
注意:对象(表)与私有同义词不能同名,否则会报ORA-00955错误