1、SQL 语句中 create 的使用 (synonym 同义词)select * from emp;等用于 select * from abc;建立共有的同义词如果用户的等级不够建立 public 同义词,可以在 system 下授权:grant create any synonym to scott;grant create public synonym to scott;取消授权:revoke create any synoym from scott;revoke create public synoym from scott;取消同义词:drop public synonym abc;授
2、权取消同义词:grant dorp public synonym to scott;取消授权:revoke drop public synonym to scott;引入同义词(Synonym)的原因在一些商业数据库中,有时信息系统的设计或开发者为了增加易读性,故意定义一些很长的表名(也可能是其它的对象) 。这样虽然增加了易读性,但在引用这些表 或对象时就不那么方便,也容易产生输入错误。另外在实际的商业公司里,一些用户觉得某一个对象名有意义也很好记,但另一些用户可能觉得另一个名字更有意 义。ORACLE 系统提供的同义词(Synonym)就是用来解决以上的难题的。设想一下在您的日常工作中您每天
3、都要使用 supplier 表许多次,而且您的英文打字的水平并不高。在这种情形下,您就可以借助于同义词(Synonym)来帮助您提高生产力。怎样创建同义词(Synonym)现在您就可以使用如下的 CREATE SYNONYM 语句(例 15-38)为表 supplier 建了一个同义词(别名)s。SQL CREATE SYNONYM s FOR supplier;同义词已创建。现在您就可以把同义词(别名)s 当成 supplier 来使用。您可以使用如下的查寻语句来验证这一点。SQL SELECT * FROM s;S_CODE SNAME CONTACT PHONE FAX - - - -
4、-2000 仙客来百货 张根发 4444944 44448442010 心太软小商品 石铁心 1741741 17417422021 食为天餐具 金元宝 1671671 16716742032 食为先餐具 陆合彩 1681684 1681684那您可能会问,您怎样才能知道您到底拥有哪些同义词(Synonym)呢?还记得数据字典 user_objects 吗?既然同义词(Synonym)是对象,它们在这个数据字典中就一定有记载。因此您可以使用如下的查寻语句(例 15-41)从数据字典 user_objects 中得到您所拥有的全部同义词(Synonym)的信息。当然为了使 SQL*PLUS 的显
5、示输出更加清晰您 应该先使用如下的 SQL*PLUS 格式化命令SQL col object_name format a20SQL SELECT object_name, object_type, created, status FROM user_objectsWHERE object_type LIKE SYN%;OBJECT_NAME OBJECT_TYPE CREATED STATUS- - - -S SYNONYM 28-4 月 -03 VALID 显示的结果表明:在您的模式(用户)下只有一个同义词(Synonym),那就是您刚刚建立的同义词(Synonym)s。但是显示的结果并没有
6、告诉您这个同义词(Synonym)到底是基于那个表的及表的主人是谁。如果您有一个这样同义词(Synonym)时, 这方面的信息也许就显得特别重要了。您可以使用如下的查寻语句从数据字典 user_synonyms 中得到这方面的信息。当然为了使 SQL*PLUS 的显示输出更加清晰您应该先使用如下的 SQL*PLUS 格式化命令SQL col table_owner for a12SQL col table_name for a12SQL SELECT synonym_name, table_owner, table_name FROM user_synonyms;SYNONYM_NAME TA
7、BLE_OWNER TABLE_NAME- - -S SCOTT SUPPLIER 显示的结果表明:在您的模式(用户)下只有一个同义词(Synonym),那就是您刚刚建立的同义词(Synonym)s。该同义词(Synonym)是基于表 supplier,而这个表的主人是SCOTT。创建同义词(Synonym)的语句格式如下:CREATE PUBLIC SYNONYM 同义词的名字FOR 对象名;其中: PUBLIC: 系统中所有的用户都可以访问所创建的同义词 同义词的名字: 所创建的同义词的名字 对象名: 创建的同义词所基于的对象名在创建同义词时要注意的事项: 所基于的对象不能包含在任何软件包
8、中 一个私有的同义词不能与任何该用户下的其它对象重名您刚刚创建的同义词(Synonym)s 是一个私有的同义词,即只能在您的用户(SCOTT)下直接引用,如果其它用户引用它就必需冠以用户名.(既 scott.s 的方式引用) 。这样作很不方便。如果您所建的表 supplier 是一个所有用户共享并经常使用的表,您应该怎样处理这一问题呢?创建公用同义词(Synonym)您可以为 supplier 表创建一个公用同义词(Synonym)。为了演示方便,您应该从当前的SCOTT 用户切换到另一个用户下,如 SYSTEM。您可以使用如下的 SQL*PLUS 命令(例15-44)来完成用户的切换。SQL
9、 CONNECT SYSTEM/MANAGER已连接。 现在您如果使用如下的查寻语句,您是不会得到您想要的信息的。SQL SELECT * FROM s;结果FROM s * ERROR 位于第 2 行: ORA-00942: 表或视图不存在您如果再使用如下的查寻语句,您也同样不会得到您想要的信息的。SQL SELECT * FROM supplier;结果FROM supplier * ERROR 位于第 2 行: ORA-00942: 表或视图不存在如果您在同义词(Synonym)s 之前冠以用户名.(scott. ) ,您就可以得到您所需要的信息了。如下面的查寻语句SQL SELECT
10、* FROM scott.s;结果S_CODE SNAME CONTACT PHONE FAX - - - - -2000 仙客来百货 张根发 4444944 44448442010 心太软小商品 石铁心 1741741 17417422021 食为天餐具 金元宝 1671671 16716742032 食为先餐具 陆合彩 1681684 1681684由于其它用户在引用这一同义词(Synonym)s 时必须冠以您的用户名(.).,这样很不方便,而且也容易产生输入错误,所以您可以使用如下的 DDL 语句为 scott 用户下的 supplier建立一个公用的同义词(Synonym)ss。SQL
11、 CREATE PUBLIC SYNONYM ss FOR scott.supplier;同义词已创建。现在您就可以利用您刚刚创建的公用的同义词(Synonym)ss 来获得您所希望得到的信息。您可以使用如下的查寻语句SQL SELECT * FROM ss;S_CODE SNAME CONTACT PHONE FAX - - - - -2000 仙客来百货 张根发 4444944 44448442010 心太软小商品 石铁心 1741741 17417422021 食为天餐具 金元宝 1671671 16716742032 食为先餐具 陆合彩 1681684 1681684您也可能会问,其它
12、用户是否也可以使用同样的方法访问同义词(Synonym)ss。答案是肯定的。如果您还有疑问的话,您可以试着以如下的 SQL*PLUS 命令(例 15-50)以 SYS用户登录进入 ORACLE 数据库。SQL CONNECT SYS/ORACLE AS SYSDBA;已连接。 现在您就可以利用公共同义词(Synonym)ss 来获得您所希望得到的信息。您可以使用如下的查寻语句SQL SELECT * FROM ss;S_CODE SNAME CONTACT PHONE FAX - - - - -2000 仙客来百货 张根发 4444944 44448442010 心太软小商品 石铁心 1741
13、741 17417422021 食为天餐具 金元宝 1671671 16716742032 食为先餐具 陆合彩 1681684 1681684ORACLE 并没有提供修改同义词(Synonym)的命令。如果您要修改某一同义词(Synonym)的话,您要先把它删除掉,之后再重新建立这个同义词(Synonym)。删除同义词(Synonym)如果经过了一段时间,您发现同义词(Synonym)s 已经没什么用处了,您就可以使用如下的 DDL 语句将它删除掉。不过在这之前您可能得先使用如下的 SQL*PLUS 命令重新注册到 SCOTT 用户下。SQL CONNECT SCOTT/TIGER已连接。 S
14、QL DROP SYNONYM s;同义词已丢弃。虽然结果已经显示:“同义词已丢弃。 ”,但是为了谨慎起见,您还是应该使用如下的查寻语句查看一下数据字典 user_objects。SQL SELECT object_name, object_type, created, statusFROM user_objects WHERE object_type LIKE SYN%;未选定行 或者您应该使用如下的查寻语句查看一下数据字典 user_ synonyms。SQL SELECT synonym_name, table_owner, table_name FROM user_synonyms;未选定行 显示的结果进一步证实了您已经将同义词(Synonym)s 成功地从系统中删除掉。删除同义词(Synonym)语句的格式如下:DROP SYNONYM 同义词的名字;