一、同义词synonym
connect sys/123 as sysdba;
select * from emp;
ORA-00942: 表或视图不存在
create synonym emp for scott.emp;
select * from emp;

1.定义
同义词是一个模式对象的别名。
可以为一个表或视图、 序列、 PL/SQL 程序单元、 用户定义的对象类型、
或另一个同义词等创建同义词。
因为同义词只是一个别名,因此除了要在数据字典存储其定义之外,不需要其它存储。

2.用途
同义词可以为数据库用户简化 SQL 语句。
同义词也可以用于隐藏底层模式对象的标识和位置。
如果必须重命名或移动底层对象,仅需要重新定义同义词。
基于同义词的应用程序,可以无需修改而继续工作。

3.分类
分类:私有同义词、公共同义词。
私有同义词与其所有者在同一个模式中,只有其所有者对其可用性具有控制权。
公共同义词由名为PUBLIC的用户组所有,并且能被每一个数据库用户访问。

4.语法:
4.1 创建
create [public] synonym syn_name for <obj>;
说明:
私有同义词即不带public关键字;
公共同义词即带public关键字。
为了方便使用,syn_name同义词名一般和表名保持一致。

举例:
create synonym emp for scott.emp;
create public synonym dept for scott.dept;

select * from emp;
select * from dept;
--alter user system identified by system;
4.2 更名(只适用于私有同义词)
rename syn_name to <new_syn>;
举例:
rename emp to syn_emp;
rename syn_emp to emp;
--rename dept to syn_dept;

4.3 删除
drop [public] synonym syn_name;
说明:
删除私有同义词时不带public关键字;
删除公共同义词时必须带public关键字。
举例:
drop synonym emp;
drop public synonym dept;

4.4 数据字典
select * from dba_synonyms where synonym_name in ('EMP','DEPT')
select * from all_synonyms;
select * from user_synonyms;

5.限制:
请尽量少用公共同义词,因为它们使数据库整合更困难。
过度使用公共同义词会导致应用程序之间的命名空间冲突。
同义词本身不是安全可控的。
当在一个同义词上授予对象权限时,其实是在底层对象上授予权限。
同义词在grant 语句中只作为对象的别名。

二、database link
1.定义
两个oracle数据库实例之间直接通信的方式。
database link是定义一个数据库到另一个数据库的路径的对象,
database link允许用户查询远程数据库中的表及执行远程程序。
在任何分布式环境里,database link都是必要的。
另外要注意的是database link是单向的连接。
在创建database link的时候,Oracle在数据字典中保存相关的database link的信息,
在使用database link的时候,Oracle通过Oracle Net用用户预先定义好的连接信息
访问相应的远程数据库以完成相应的工作。
建立database link之前需要确认的事项:
确认从local database到remote database的网络连接是正常的,tnsping要能成功。
确认在remote database上面有相应的访问权限。
确认本地账户是否有建立dblink的权限。
如果需要创建全局 DBLink,则需要先确定用户有创建 dblink 的权限:
select * from user_sys_privs where privilege like upper('%database link%');
如果没有,则需要使用 sysdba 角色给用户赋权:
grant create public database link to username;

2.database link分类
分为三类:Private、Public、Global。
2.1 Private
创建database link的user拥有该database link权限
在本地数据库的特定的schema下建立的database link。
只有建立该database link的schema的session能使用这个database link来访问远程的数据库。
同时也只有该Owner能删除它自己的private database link。

2.2 Public
Owner是PUBLIC.
Public的database link是数据库级的,
本地数据库中所有的拥有数据库访问权限的用户或pl/sql程序都能使用此database link
来访问相应的远程数据库。
2.3 Global
Owner是PUBLIC.
Global的database link是网络级的,
When an Oracle network uses a directory server,
the directory server automatically create and manages global database links (as net service names)
for every Oracle Database in the network.
Users and PL/SQL subprograms in any database can use a global link
to access objects in the corresponding remote database.

3.创建dblink所需的权限
3.1 create database link
local creation of a private database link.
3.2 create public database link
local creation of a public database link.
3.3 create session
remote creation of any type of database link.

4.步骤
4.1 检查远程服务器网络
ping 192.168.1.105
4.2 配置本地实例名
修改tnsnames.ora文件 或用Net Configuration Assistant工具配置
4.3 登录远程数据库
IP、实例名、账户、密码、端口
4.4 创建dblink
4.4.1 Private
基本语法
CREATE database link link_name
[CONNECT TO user_name IDENTIFIED BY password]
[USING 'connect_string']
举例:
create database link 数据库连接名
connect to 用户名 identified by 密码
using '本地配置的实例名'
connect sys/123 as sysdba;
create database link ORCL111 connect to scott identified by "123" using 'ORCL111';
select * from dept@oracle;

create public database link ORCL_111 connect to scott identified by "123" using 'ORCL111';
select * from dept@dblink_lv;

drop database link ORCL111;
select * from emp@ORCL111;


4.4.2 PUBLIC
基本语法
CREATE public database link link_name
[CONNECT TO user_name IDENTIFIED BY password]
[USING 'connect_string']

5.使用dblink
select * from 表名@dblink_name;
create or replace view 视图名 as (select 字段 from 用户.表名@dblink_name);
create or replace synonym 同义词名 for 表名@dblink_name;
select func_dept_job@ORCL_111('SMITH') from dual; --调用远程函数
exec proc_emp_sal@ORCL_111(1,10); --调用远程过程

6.删除dblink
drop database link dblink_name;

7.限制
创建 DBLink 很简单,但是在使用中后台却出现锁,
查看这个锁的方法可以去 console 中看到或者查询数据库。
每次使用dblink查询的时候,均会与远程数据库创建一个连接,dblink 应该不会自动释放这个连接,
如果是大量使用 dblink 查询,会造成 web 项目的连接数不够,导致系统无法正常运行。

8.完整语法
CREATE [SHARED][PUBLIC] database link link_name
[CONNECT TO [user][current_user] IDENTIFIED BY password]
[AUTHENTICATED BY user IDENTIFIED BY password]
[USING 'connect_string']

说明:
1) 权限:
创建数据库链接的帐号必须有create database link或create public database link的系统权限,
用来登录到远程数据库的帐号必须有create session权限。
这两种权限都包含在connect角色中(create public database link权限在dba中)。
一个公用数据库链接对于数据库中的所有用户都是可用的,
而一个私有链接仅对创建它的用户可用。
由一个用户给另外一个用户授权私有数据库链接是不可能的,
一个数据库链接要么是公用的,要么是私有的。
2)link :
当source端的数据库GLOBAL_NAME=TRUE时,
link名必须与远程数据库的全局数据库名global_name相同;
否则,可以任意命名。
3)current_user使用该选项是为了创建global类型的dblink。
在分布式体系中存在多个数据库的话,
如果想要在每一个数据库中都可以使用同样的名字来访问数据库a,
那在每个数据库中都要创建一个到数据库a的db_link,太麻烦了。
所以现在有这个选项,只要创建一次。
所有的数据库都可以使用这个db_link来访问了。
要使用这个特性,必须有oracle nameserver或者ORACLE目录服务器。
并且数据库a的参数global_names=true。
4)connectstring:连接字符串,
tnsnames.ora中定义远程数据库的连接串,也可以在创建dblink的时候直接指定。
5)username、password:远程数据库的用户名,口令。
如果不指定,则使用当前的用户名和口令登录到远程数据库,
当创建connected user类型的dblink时,需要如果采用数据字典验证,则需要两边数据库的用户名密码一致。
创建database link选项说明
6)SHARED 、不指定
不指定:默认值建立一个dedicated(专用)的连接,每一个使用database link的本地session都会对应有一个远程数据库的session。
SHARED:创建一个共享的数据库连接,同时要指定database link_authentication。
使用shared方式的 database link是数据库会限制到远程数据库的连接的数量,这样以避免过多的连接对远程数据库造成太大的压力。
在使用shared database link的时候,到database link的连接会在连接以后与本地连接断开,
为防止未授权的session使用此链接而要求在创建shared database link的时候必须要指定database link_authentication。
7)PUBLIC、不指定
不指定: 默认值建立一个private的database link
PUBLIC: 公共连接,这样的连接可以被数据的所有的用户访问
8)database link用户验证方法取值说明
不指定:默认值采取Connected User的验证方法
CONNECT TO CURRENT_USER:采取CURRENT_USER的验证方式
CONNECT TO user_name IDENTIFIED BY password:采取Fiexed User的验证方式

posted on 2018-07-08 12:54  Brad Miller  阅读(747)  评论(0编辑  收藏  举报