Oracle同义词总结

Oracle同义词是数据库对象的别名,用于简化访问和增强安全性。分为公用和私有,常用于多用户协同开发,提供位置透明性和简化SQL。创建、权限管理和使用同义词涉及CREATE SYNONYM权限,私有同义词优先于公用同义词。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Oracle同义词总结

同义词概念

Oracle的同义词(synonyms)从字面上理解就是别名的意思,和视图的功能类似,就是一种映射关系。
它可以节省大量的数据库空间,对不同用户的操作同一张表没有多少差别;
它扩展了数据库的使用范围,能够在不同的数据库用户之间实现无缝交互;
Oracle数据库中提供了同义词管理的功能。
同义词是数据库对象的一个别名,经常用于简化对象访问和提高对象访问的安全性。
在使用同义词时,Oracle数据库将它翻译成对应方案对象的名字。
与视图类似,同义词并不占用实际存储空间,只有在数据字典中保存了同义词的定义。
在Oracle数据库中的大部分数据库对象,如表、视图、物化视图、序列、函数、存储过程、包、同义词等等,数据库管理员都可以根据实际情况为他们定义同义词。


同义词分类

Oracle同义词有两种类型,分别是Oracle公用同义词与Oracle私有同义词。普通用户创建的同义词一般都是私有同义词,公有同义词一般由DBA创建,普通用户如果希望创建同义词,则需要CREATE PUBLIC SYNONYM这个系统权限。

1)Oracle公用同义词:由一个特殊的用户组Public所拥有。顾名思义,数据库中所有的用户都可以使用公用同义词。公用同义词往往用来标示一些比较普通的数据库对象,这些对象往往大家都需要引用。

2)Oracle私有同义词:它是跟公用同义词所对应,他是由创建他的用户所有。当然,这个同义词的创建者,可以通过授权控制其他用户是否有权使用属于自己的私有同义词。


同义词作用

1) 多用户协同开发中,可以屏蔽对象的名字及其持有者。如果没有同义词,当操作其他用户的表时,必须通过user名.object名的形式,采用了Oracle同义词之后就可以隐蔽掉user名,当然这里要注意的是:public同义词只是为数据库对象定义了一个公共的别名,其他用户能否通过这个别名访问这个数据库对象,还要看是否已经为这个用户授权。

2) 为用户简化sql语句。上面的一条其实就是一种简化sql的体现,同时如果自己建的表的名字很长,可以为这个表创建一个Oracle同义词来简化sql开发。

3)为分布式数据库的远程对象提供位置透明性。

4)Oracle同义词在数据库链接中的作用

数据库链接是一个命名的对象,说明一个数据库到另一个数据库的路径,通过数据库链接可以实现不同数据库之间的通信。

Create database link 数据库链名 connect to user名 identified by 口令 using ‘Oracle连接串’;
访问对象要通过 object名@数据库链名。
同义词在数据库链中的作用就是提供位置透明性。

 
同义词权限管理

与同义词相关的权限有CREATE SYNONYM、CREATE ANY SYNONYM、CREATE PUBLIC SYNONYM权限。

1:用户在自己的模式下创建私有同义词,这个用户必须拥有CREATE SYNONYM权限,否则不能创建私有同义词。

如下所示,用户DM缺少CREATE SYNONYM权限,创建同义词时会报ORA-01031错误
SQL> CREATE SYNONYM TEST FOR DM.TM_WGG_ATM_GTW_MON;
CREATE SYNONYM TEST FOR DM.TM_WGG_ATM_GTW_MON
ORA-01031: insufficient privileges

用sys账号给DM账号赋予CREATE SYNONYM的权限
SQL> GRANT CREATE SYNONYM TO DM;
Grant succeeded.

然后创建私有同义词
SQL> CREATE SYNONYM TEST FOR DM.TM_WGG_ATM_GTW_MON;
Synonym created

2:如果需要在其它模式下创建同义词,则必须具有CREATE ANY SYNONYM的权限。

看下面的例子

用户DM想创建SCOTT模式下的私有同义词
SQL> CREATE SYNONYM SCOTT.EM FOR SOCTT.EMP;
CREATE SYNONYM SCOTT.EM FOR SOCTT.EMP
ORA-01031: insufficient privileges

用sys账号给DM账号赋予CREATE ANY SYNONYM的权限
SQL> GRANT CREATE ANY SYNONYM TO DM;
Grant succeeded.

SQL> CREATE SYNONYM SCOTT.EM FOR SOCTT.EMP;
Synonym created

3:创建公有同义词则需要CREATE PUBLIC SYNONYM系统权限。


创建同义词

普通用法如下所示:
CREATE [OR REPLACE] [PUBLIC] SYNONYM [ schema.] 同义词名称 FOR [ schema.] object [ @dblink ];

--专有(私有)同义词
CREATE SYNONYM SYSN_TEST FOR TEST;

--公共同义词
CREATE PUBLIC SYNONYM PUBLIC_TEST FOR TEST;

如果要创建一个远程的数据库上的某张表的同义词,需要先创建一个Database Link(数据库连接)来扩展访问,然后再使用如下语句创建数据库同义词:
create synonym table_name for table_name@DB_Link;

公共同义词是和用户的schema无关的,但是公共的意思并不是所有的用户都可以访问它,必须被授权后才能进行;
私有同义词是schema的对象


查看同义词

SQL> SELECT * FROM DBA_SYNONYMS WHERE SYNONYM_NAME IN ( 'SYSN_TEST','PUBLIC_TEST');

OWNER   SYNONYM_NAME    TABLE_OWNER    TABLE_NAME   DB_LINK
-----   ------------    ----------     ---------    ----------
PUBLIC    PUBLIC_TEST        ETL        TEST
 ETL        SYSN_TEST        ETL        TEST


SQL> SELECT * FROM USER_SYNONYMS


使用同义词

SELECT * FROM SYSN_TEST;

使用同义词可以保证当数据库的位置或对象名称发生改变时,应用程序的代码保持稳定不变,仅需要改变同义词;

当使用一个没有指定schema的同义词时,首先在用户自己的schema中寻找,然后在公共同义词中寻找


删除同义词

DROP [ PUBLIC ] SYNONYM [ schema. ] 同义词名称 [ FORCE ];

DROP SYNONYM SYSN_TEST;
DROP PUBLIC SYNONYM PUBLIC_TEST;--当同义词的原对象被删除时,同义词并不会被删除


编译同义词

ALTER SYNONYM T COMPILE; --当同义词的原对象被重新建立时,同义词需要重新编译

对原对象进行DDL操作后,同义词的状态会变成INVALID;当再次引用这个同义词时,同义词会自动编译,状态会变成VALID,无需人工干预,当然前提是不改变原对象的名称

SQL> ALTER TABLE TEST ADD SEX NUMBER(1);
Table altered

SQL> SELECT OBJECT_NAME, STATUS FROM ALL_OBJECTS WHERE OBJECT_NAME='T';
OBJECT_NAME                    STATUS
------------------------------ -------
                             INVALID



问题锦集

1:公用同义词与私有同义词能否同名呢?如果可以,访问同义词时,是公有同义词优先还是私有同义词优先?
可以,如果存在公用同义词和私有同义词同名的情况,在访问同义词时,访问的是私有同义词的指向的对象。


2:为啥OE用户创建的公用同义词,HR用户不能访问呢?
因为HR没有访问OE模式下对象的权限,如果OE模式给HR用户赋予了SELECT对象等权限,那么HR用户即可访问。


3:对象、私有同义词、公共同义词是否可以存在三者同名的情况?

在用户kerry下,创建表TEST

SQL>CREATE TABLE TEST AS SELECT * FROM USER_OBJECTS WHERE 1=0;

创建私有同义词TEST

SQL> CREATE SYNONYM TEST FOR REF.REF_WGG_STUDENT;
CREATE SYNONYM TEST FOR REF.REF_WGG_STUDENT
ORA-00955: name is already used by an existing object

注意:对象(表)与私有同义词不能同名,否则会报ORA-00955错误

创建公共同义词TEST,如下所示,公共同义词可以对象同名

SQL> CREATE PUBLIC SYNONYM TEST FOR REF.REF_WGG_STUDENT;
Synonym created

访问TEST时,如下所示:它是表TEST的内容,而不是公共同义词的内容

SQL> SELECT * FROM TEST;
OBJECT_NAME  SUBOBJECT_NAME   OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE  CREATED   LAST_DDL_TIME TIMESTAMP   STATUS  TEMPORARY GENERATED SECONDARY
----------- ---------------- ---------- -------------- ------------ --------- ------------- ----------- ------- --------- --------- ---------
 
删除表TEST后,此时数据库访问的是公共同义词

SQL> DROP TABLE TEST PURGE;
Table dropped

SQL> SELECT * FROM TEST;          
 ID     NAME
--- ------------
  12

结论:
存在同名对象和公共同义词时,数据库优先选择对象作为目标;
存在同名私有同义词和公共对象时,数据库优先选择私有同义词作为目标

转自:http://www.th7.cn/db/Oracle/201212/27836.shtml


另附OCP试题

93. The ORDERS table belongs to the user OE. OE has granted the SELECT privilege on the ORDERS
table to the user HR.
Which statement would create synonym ORD so that HR can execute the following query successfully?
SELECT FROM ord;
A. CREATE SYNONYM ord FOR orders; This command is issued by OE.
B. CREATE PUBLIC SYNONYM ord FOR orders; This command is issued by OE.
C. CREATE SYNONYM ord FOR oe.orders; This command is issued by the database administrator.
D. CREATE PUBLIC SYNONYM ord FOR oe.orders; This command is issued by the database
administrator.
Answer: D
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值