Oracle_高級功能(3) synonym和database link

1、同義詞synonym
connect sys/123 as sysdba;
select * from emp;
ORA-00942: 表或視圖不存在
create synonym emp for scott.emp;
select * from emp;web

1.定義
同義詞是一個模式對象的別名。
能夠爲一個表或視圖、 序列、 PL/SQL 程序單元、 用戶定義的對象類型、
或另外一個同義詞等建立同義詞。
由於同義詞只是一個別名,所以除了要在數據字典存儲其定義以外,不須要其它存儲。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;session

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

5.限制:
請儘可能少用公共同義詞,由於它們使數據庫整合更困難。
過分使用公共同義詞會致使應用程序之間的命名空間衝突。
同義詞自己不是安全可控的。
當在一個同義詞上授予對象權限時,實際上是在底層對象上授予權限。
同義詞在grant 語句中只做爲對象的別名。oracle

2、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。 ide

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的驗證方式

相關文章
相關標籤/搜索