全部博文(18)
分类: Oracle
2012-03-05 10:08:49
同义词(以用户SYS登录不能查用户SCOTT的表:dept、emp等解决办法)
同义词:一个对象的替代名字,能够使多个用户使用同一个对象而不用将模式作为前缀放在对象的前边。
同义词分为两类:
私有的:由用户建立的,并且仅适用于那个用户去执行
公共的:由 dba 建立的,所有的用户都可以共同的拥有
查询当前的用户:
SQL> SELECT user FROM dual;
USER
------------------------------
SYS
在这个模式下查询 scott 用户的 dept 表
SQL> SELECT * FROM scott.dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
创建同义词:默认情况下是私有 的 ,当前 sys 的
SQL> CREATE SYNONYM dept FOR scott.dept;
同义词已创建。
再次查询时不需要把 scott 放在前边,就像是 sys 自己的表一样使用
SQL> SELECT * FROM dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
连接到 system 查询会出错
SQL> conn system/abc
已连接。
SQL> SELECT * FROM dept;
SELECT * FROM dept
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
回到 sys 删除同义词
SQL> DROP SYNONYM dept;
同义词已删除。
创建公共的同义词:
SQL> CREATE PUBLIC SYNONYM dept FOR scott.dept;
同义词已创建。
SQL> conn system/abc
已连接。
SQL> SELECT * FROM dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
使用同义词的情况:
应用程序的开发者是为了缩写他们在 SQL 代码期间经常需要引用的表,这种方法避免了重复敲一长串名字
公共同义词简化了应用程序的迁移,如果模式名字不同而表相同,那么同义词允许应用程序很容易的从一个数据库迁移到
另外一个数据库
有的时候使用同义词是为了查找所有用户都需要的共同的表,数据字典中 dba 视图的同义词提供了这种使用的很好的例子
另外一个作用:
使两个应用程序用不同的名字指向同一个表,虽然视图也能够完成这种任务,但是如果唯一的目的是给每一个应用程序一个
相应的商务 规则,相应商务逻辑的名字,那么同义词 或许是一个 不错的解决方案
查询这样的一个系统视图:
SQL> DESC dba_synonyms
名称 是否为空? 类型
----------------------------------------- -------- -----------------
OWNER NOT NULL VARCHAR2(30)
SYNONYM_NAME NOT NULL VARCHAR2(30)
TABLE_OWNER VARCHAR2(30)
TABLE_NAME NOT NULL VARCHAR2(30)
DB_LINK VARCHAR2(128)
查询当前 用户下的同义词:
SQL> DESC user_synonyms
名称 是否为空? 类型
----------------------------------------- -------- ----------------------
SYNONYM_NAME NOT NULL VARCHAR2(30)
TABLE_OWNER VARCHAR2(30)
TABLE_NAME NOT NULL VARCHAR2(30)
DB_LINK VARCHAR2(128)