共计 4607 个字符,预计需要花费 12 分钟才能阅读完成。
这篇文章主要介绍“Oracle 同义词是什么”,在日常操作中,相信很多人在 Oracle 同义词是什么问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Oracle 同义词是什么”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!
同义词概念
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 lsquo;Oracle 连接串 rsquo;; 访问对象要通过 object 名 @数据库链名。同义词在数据库链中的作用就是提供位置透明性。
同义词权限管理
与同义词相关的权限有 CREATE SYNONYM、CREATE ANY SYNONYM、CREATE PUBLIC SYNONYM 权限。
用户在自己的模式下创建私有同义词,这个用户必须拥有 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 系统权限。
创建同义词
创建同义词的语法如下:
普通用法如下所示:
SQL GRANT CREATE ANY SYNONYM TO DM; Grant succeeded. SQL CREATE SYNONYM SCOTT.EM FOR SOCTT.EMP; Synonym created
如果要创建一个远程的数据库上的某张表的同义词,需要先创建一个 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 SELECT * FROM T; ID NAME ----------- ---------------------------------------------------------------- SQL SELECT * FROM TEST; ID NAME ----------- ---------------------------------------------------------------- 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 ------------------------------ ------- T INVALID
问题锦集
1. 公用同义词与私有同义词能否同名呢? 如果可以,访问同义词时,是共有同义词还是私有同义词优先?
可以,如果存在公用同义词和私有同义词同名的情况,在访问同义词时,访问的是私有同义词的指向的对象。
2. 为啥 OE 用户创建的公用同义词,HR 用户不能访问呢?
因为 HR 没有访问 OE 模式下对象的权限,如果 OE 用户给 HR 用户赋予了 SELECT 对象等权限,那么 HR 用户即可访问。
3. 对象、私有同义词、公共同义词是否可以存在三者同名的情况?ORACLE 中同义词和表的优先顺序浅析是怎么样的呢?
在用户 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 ----------- -------------------------------- 1 12 SQL
结论:存在同名对象和公共同义词时,数据库优先选择对象作为目标,存在同名私有同义词和公共同义词时,数据库优先选择私有同义词作为目标。
到此,关于“Oracle 同义词是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!