Oracle——04同义词与数据库链接

Oracle——04同义词与数据库链接
Oracle的同义词(synonyms)从字面上理解就是别名的意思,和试图的功能类似,就是一种映射关系。本文介绍如何创建同义词语句,删除同义词以及查看同义词语句。

oracle的同义词总结:
从字面上理解就是别名的意思,和试图的功能类似。就是一种映射关系。

1.创建同义词语句:
create public synonym table_name for user.table_name;

其中第一个user_table和第二个user_table可以不一样。
  此外如果要创建一个远程的数据库上的某张表的同义词,需要先创建一个Database Link(数据库连接)来扩展访问,然后在使用如下语句创建数据库同义词:create synonym table_name for table_name@DB_Link;
  当然,你可能需要在user用户中给当前用户(user2)授权: grant select/delete/update on user2

2.删除同义词:
drop public synonym table_name;

3.查看所有同义词:
select * from dba_synonyms

同义词拥有如下好处:节省大量的数据库空间,对不同用户的操作同一张表没有多少差别;扩展的数据库的使用范围,能够在不同的数据库用户之间实现无缝交互;同义词可以创建在不同一个数据库服务器上,通过网络实现连接。

Oracle数据库中提供了同义词管理的功能。Oracle同义词是数据库方案对象的一个别名,经常用于简化对象访问和提高对象访问的安全性。

AD:
在Oracle中对用户的管理是使用权限的方式来管理的,也就是说,如果我们想使用数据库,我们就必须得有权限,但是如果是别人将权限授予了我们,我们也是能对数据库进行操作的,但是我们必须要已授权的表的名称前键入该表所有者的名称,所以这就是比较麻烦的,遇到这种情况,我们该怎么办呢?创建个Oracle同义词吧!这样我们就可以直接使用同义词来使用表了。

1.同义词的概念
Oracle数据库中提供了同义词管理的功能。同义词是数据库方案对象的一个别名,经常用于简化对象访问和提高对象访问的安全性。在使用同义词时,Oracle数据库将它翻译成对应方案对象的名字。与视图类似,同义词并不占用实际存储空间,只有在数据字典中保存了同义词的定义。在Oracle数据库中的大部分数据库对象,如表、视图、同义词、序列、存储过程、包等等,数据库管理员都可以根据实际情况为他们定义同义词。

2.Oracle同义词的分类
Oracle同义词有两种类型,分别是公用Oracle同义词与私有Oracle同义词。
1)公用Oracle同义词:由一个特殊的用户组Public所拥有。顾名思义,数据库中所有的用户都可以使用公用同义词。公用同义词往往用来标示一些比较普通的数据库对象,这些对象往往大家都需要引用。
2)私有Oracle同义词:它是跟公用同义词所对应,他是由创建他的用户所有。当然,这个同义词的创建者,可以通过授权控制其他用户是否有权使用属于自己的私有同义词。

3.Oracle同义词创建及删除
创建公有Oracle同义词的语法:Create [public] synonym 同义词名称 for [username.]objectName;
Drop [public] synonym 同义词名称

4.Oracle同义词的作用
  同义词拥有如下好处:
       节省大量的数据库空间,对不同用户的操作同一张表没有多少差别;
       扩展的数据库的使用范围,能够在不同的数据库用户之间实现无缝交互;
       同义词可以创建在不同一个数据库服务器上,通过网络实现连接

1) 多用户协同开发中,可以屏蔽对象的名字及其持有者。如果没有同义词,当操作其他用户的表时,必须通过user名.object名的形式,采用了Oracle同义词之后就可以隐蔽掉user名,当然这里要注意的是:public同义词只是为数据库对象定义了一个公共的别名,其他用户能否通过这个别名访问这个数据库对象,还要看是否已经为这个用户授权。
2) 为用户简化sql语句。上面的一条其实就是一种简化sql的体现,同时如果自己建的表的名字很长,可以为这个表创建一个Oracle同义词来简化sql开发。
3)为分布式数据库的远程对象提供位置透明性。

5.Oracle同义词在数据库链中的作用
数据库链是一个命名的对象,说明一个数据库到另一个数据库的路径,通过其可以实现不同数据库之间的通信。

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


using后面指定的是链接字符串,也就是远程数据库的网络服务名,这个服务名保存在TNSNAMES.ORA文件中,在该文件中定义了协议、主机名、端口和数据库名。
 
注意:创建数据库链接的帐号必须有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系统权限,用来登录到远程数据库的帐号必须有CREATE SESSION权限。这两种权限都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK权限在DBA中)。
 
一个公用数据库链接对于数据库中的所有用户都是可用的,而一个私有链接仅对创建它的用户可用,是不可授权的。由一个用户给另外一个用户授权私有数据库链接是不可能的,一个数据库链接要么是公用的,要么是私有的。
 
创建数据库链接时,还可以使用缺省登录方式,即不指定远程数据库的用户名和密码:
create public database link zrhs_link using ‘zrhs’;
在不指定用户名和口令的情况下,ORACLE使用当前的用户名和口令登录到远程数据库
 
 
如果没有配置TNSNAMES.ORA,第二种创建db link的方法:
 create database link test connect to scott identified by tiger using
 '(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.112)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )'
 
 
查询创建好的db link:
select * from sys.link$;
 
一直以为只有private db link可以查到密码,原来public 的dblink 也可以看到密码。
只是需要用sys用户登录查询。 
查询dblink的user 密码,用sys 登陆
select * from SYS.link$;
select * from SYS.link$ l, SYS.user$ u
 
 WHERE l.owner# IN (SELECT kzsrorol
                      FROM x$kzsro) AND l.owner# = u.user#;
 
如果是private 的dblink,就可以用owner登录,查询 user_db_links
select * from user_db_links;
 
db link创建好之后,访问对象
访问对象要通过 object名@数据库链名。 
 
4.同义词的删除
drop [public] synonym 同义词名称
要想删除私有同义词就 省略 public 关键字
要想删除公共同义词就要 包括public 关键字
例如:
drop synonym emp; --删除名为emp 的私有同义词
drop public synonym public_emp; --删除名为public_emp的公有同义词


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

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

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

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

假设oracle有以下两个用户: admin , visitor
我们在admin下建立了 testtable 这个表,并且对visitor用户赋权
然后我们用visitor登陆 : 查询这个表的时候我们一定需要这样写
select * from admin.testtable
如果直接写 select * from testtable oracle会报错说表不存在
但是我们可以在visitor里建立[私有同义词] 让 testtable = admin.testtable
这样在visitor下就可以直接输入 select * from testtable进行查询
但是如果用户很多的情况下会觉得很麻烦,因为每个用户都需要加[私有同义词] testtable=admin.testtable
所以就出现了 [公有同义词]
直接在admin用户下建立公有同义词 testtable = testtable
这样做好后,所有的用户都可以直接使用
select * from testtable 进行访问而并不需要加前缀,也不用再加[私有同义词]了

项目中例子:
oracle 用户 infsa 下 有表 a,把权限赋给infss用户

在infsa下执行
grant all on a to infss ;
create public synonym inf for a;

同义词作用
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> 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:对象、私有同义词、公共同义词是否可以存在三者同名的情况?

在用户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同义词数据库链接synonymdatabase link 
一、背景
有两个sid:Asid,Bsid,在Asid下有两个用户Auser1,Auser2,在Bsid下有一个用户Buser1。其中Auser2和Buser1建立了dblink。现希望通过登录Buser1访问Auser1上的三张表table1,table2,table3信息和函数function1。

二、步骤
①登录Auser1对Auser2授权(若需要删除则加上delete)
grant insert,select,update on table1 to Auser2;
grant insert,select,update on table2 to Auser2;
grant insert,select,update on table3 to Auser2;
grant execute on function1 to Auser2;

②登录Auser2建立同义词
create synonym table1 for Auser1.table1;
create synonym table2 for Auser1.table1;
create synonym table3 for Auser1.table1;
create synonym function1 for Auser1.function1;

③登录Buser1查找db_link名(例如查出来的db_link名为mydblink1)
select username,db_link from user_db_links

④建立Buser1的同义词
create synonym table1 for Auser2.table1@mydblink1;
create synonym table2 for Auser2.table2@mydblink1;
create synonym table3 for Auser2.table3@mydblink1;
create synonym function1 for Auser2.function1@mydblink1;

⑤测试
此时登录Buser1通过select * from table1就可以访问table1了。

三、注意点
也可以建立procedure的同义词,但是这样执行的过程中不允许commit。如果要提交的话请在如JDBC中commit()。


oracle dblink用法总结
oracle中的database link是定义一个数据库到另一个数据库的路径的对象,database link允许你查询远程表和执行远程程序。在任何分布式环境里,dblink都是必要的,另外注意database link是单向的连接。在创建database link的时候,oracle在数据字典中存储了相关的database link的信息,在使用database link的时候,oracle再通过oracle net用户预先定义好的连接信息访问相应的远程数据库来完成相应的工作。

1、在建立database link之前需要注意:
(1)确认从local database到remote database的网络连接是否正常,tnsping要能成功。
(2)确认在remote database上面有相应的访问权限。

2、oracle database link可分为下面三类:
(1)private:创建的是用户级别的dblink,只有创建该dblink的用户才可以使用这个dblink来访问远程的数据库,同时也只有该用户可以删除这个dblink。
(2)public:创建的是数据库级别的dblink,本地数据库中所有的用户数据库访问权限的用户或者pl/sql程序都能使用这个dblink。
(3)global:创建的是网络级别的dblink,这是对于oracle network而言的。

3、创建dblink需要的权限:
如果你新建了一个用户,那么你必须为它授予以下权限才可以创建dblink:create database link、create public database link、create session。

4、创建dblink:
-- 如果不指定public,默认的是private,host后面可以是ip地址,也可以是解析过的域名
CREATE PUBLIC DATABASE LINK db_link_test02 CONNECT TO rms IDENTIFIED BY rms
  USING '(DESCRIPTION= 
          (ADDRESS_LIST = 
                (ADDRESS=(PROTOCOL=tcp)(HOST=mom_uat_new)(PORT=1521)))
          (CONNECT_DATA=
              (SERVICE_NAME=ormst1)
              )
         )';
5、查看dblink:

查看dblink,可以从dba_objects、dba_db_links这两张表去查:
SELECT *
  FROM dba_objects do
 WHERE do.object_type = 'DATABASE LINK';

SELECT *
  FROM dba_db_links ddl;
除了上面两张表,还有all_db_links、user_db_links。

6、使用dblink:
-- 最简单的用法
SELECT *
  FROM table_name@database_link;

-- 不想让别人知道database link名字的时候,可以使用同义词包装一下

CREATE synonym table_name FOR table_name@database_link;
SELECT *
  FROM table_name;

-- 也可以建立一个视图来封装
CREATE view table_name_v AS
  SELECT *
    FROM table_name@database_link;

7、删除dblink:
-- 删除public类型的dblink
DROP PUBLIC DATABASE LINK dblink_name;

-- 删除private类型的dblink,只有创建者自己能删
DROP DATABASE LINK dblink_name;
 

1、同义词:
在分布式数据库环境中,为了识别一个数据库对象,必须规定主机名、服务器名、对象的拥有者和对象名。这无疑增加了访问者的访问难度。为了给不同的用户使用数据库对象时提供一个简单的、唯一标识数据库对象的名称,可以为数据库对象创建同义词。

举例说明:假设我们在数据库database中有一个用户user拥有表table,那么当数据库database中的其他用户需要访问table表的时候需要使用user.table的方式访问,这就要求我们在访问table表的时候必须知道table表的拥有者是谁。为了避免这种现象我们可以建立一个同义词synonym指向user.table表,那么以后任何用户都可以直接使用synonym访问user的table表了。

同义词可以指向的对象有表、视图、过程、函数、包和序列。
同义词有公共同义词和私有同义词两种。公共同义词是数据库中所有用户共享,而私有同义词是只有自己可以使用。

使用SQL创建同义词:
 Sql代码
create [public] synonym [schema.]synonymName for [schema.]object[@dblink]  
--public表示创建一个公共同义词,默认是私有的。@dblink表示创建的是远程数据库的同义词,dblink是远程数据库链接的名称。  
 

使用SQL删除同义词:
 Sql代码
drop [public] synonym [schema.]synonymName  
--public表示删除一个公用同义词,如果不指定则默认是删除私有同义词,当对应的私有同义词不存在时则报错。  
 


2、数据库链接:
作为一个分布式数据库系统,Oracle提供了使用远程数据库的功能。如果表在远程数据库中,为了指定远程数据库中一个对象的访问路径,必须创建一个数据库链接,使本地用户通过这个数据库链接登录到远程数据库上使用它的数据。数据库链接也有公有和私有两种,私有则只有创建者可以访问,默认是私有的。
 
创建数据库链接:
 Sql代码
        create [public] database link dababaseLinkName [connect to user identified by password] using connectString.  
--当创建一个数据库链接时,必须指定与数据库相链接的用户名、用户口令以及与远程数据库相连的服务器名字。如果不指定用户,则Oracle 

--将使用本地用户名和口令来建立与远程数据库的链接。假设:我现在以admin/admin登录到了本地的Oracle数据库中,那么如果在我创建数据库  
--链接的时候没有指定user和password,Oracle将使用本地的用户名和口令admin/admin进行登录建立数据库链接。  
--connectString是类似于这种形式“127.0.0.1:1521/Orcl”,就是主机ip:端口号/数据库服务名。其中端口号默认是1521,主机ip默认是本地的。  
--所以当建立本地的数据库链接时connectString可以写成‘ORCL’,即数据库服务名。  
--创建数据库链接的例子:create public database link localLink connect to username identified by password using '127.0.0.1:1521/ORCL';  
 
 
使用远程数据库链接:
创建了远程数据库链接以后,我们就可以使用它了。假设我们现在创建了一个到远程数据库ORCL的数据库链接orclLink,在ORCL的当前用户中有一个表t_module, 用户scott有一个表emp,那么我们就可以利用如下方式访问t_module中的数据了:
 
Sql代码
select * from t_module@orclLink  
 
但是当我们需要访问scott的emp表的时候则需要加入schema,访问方式如下:
 
Sql代码
select * from scott.emp@myLink  
 
我们也可以为t_module建立远程的同义词:
 
Sql代码
create synonym moduleSyn for t_module@orclLink  
 
为其他用户表如scott的emp表建立同义词的时候则需要加入schema,如:
 
Sql代码
create synonym scottEmp for scott.emp@orclLink  
 
建立了远程的同义词后,我们就可以使用如下访问方式了:
 
Sql代码
select * from moduleSyn;  
select * from scottEmp;  
 

删除数据库链接:
 
Sql代码
drop [public] database link databaseLinkName

猜你喜欢

转载自zhyp29.iteye.com/blog/2300380