Oracle_高级功能(3) synonym和database link
一、同義詞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的驗證方式
轉載于:https://www.cnblogs.com/BradMiller/p/9279769.html
總結
以上是生活随笔為你收集整理的Oracle_高级功能(3) synonym和database link的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: es6笔记 day3---Promise
- 下一篇: MySQL数据库的权限管理