1. 程式人生 > >Oracle建立同義詞及dblink

Oracle建立同義詞及dblink

一、定義

同義詞顧名思義,是資料庫方案物件的一個別名。這裡的資料庫方案物件指表、檢視、序列、儲存過程、包等。

Oracle物件知識:同義詞(Synonym)建立刪除,同義詞(Synonym)是資料庫物件的一個別名,Oracle可以為表、檢視、序列、過程、函式、程式包等指定一個別名。同義詞有兩種型別:

私有同義詞:擁有CREATE SYNONYM許可權的使用者(包括非管理員使用者)即可建立私有同義詞,建立的私有同義詞只能由當前使用者(建立者使用者)使用

公有同義詞:系統管理員可以建立公有同義詞,公有同義詞可以被所有使用者訪問。(注:公有同義詞在同一例項下的所有使用者都是可以訪問的


二、同義詞的好處

1、不佔記憶體空間,節省大量的資料庫空間

2、簡化了資料庫物件的訪問

3、提高了資料庫物件訪問的安全性

4、擴充套件的資料庫的使用範圍,能夠在不同的資料庫使用者之間實現無縫互動;同義詞可以建立在不同一個數據庫伺服器上,通過網路實現連線


三、賦予許可權,建立同義詞的時候還需要賦於相關的許可權:

用sys賬號給test賬號賦予CREATE [PUBLIC] SYNONYM的許可權

授許可權私有同義詞:
GRANT CREATE SYNONYM TO test;

授許可權公有同義詞:
GRANT CREATE PUBLIC SYNONYM TO test;


刪除私有同義詞需要有DROP ANY SYNONYM許可權。
GRANT DROP ANY SYNONYM TO test;

刪除公有同義詞需要有DROP PUBLIC SYNONYM許可權。
GRANT DROP PUBLIC SYNONYM TO test;


四、建立同義詞的語法是:

-- 建立公有同義詞:
create public synonym table_a for user.table_a;

-- 建立私有同義詞:
create synonym table_b for user.table_b;


五、同義詞的刪除語法

因為同義詞也是物件 ,刪除語法同表一樣

-- 刪除公有同義詞:
drop public synonym table_a;

-- 刪除私有同義詞:
drop synonym table_b;


六、跨庫查詢,oracle dblink

1、dblink擴充套件訪問,建立同義詞

    如果要訪問不同資料庫下或者不同使用者下的表table_a,當然也可以使用同義詞,但需要先建立一個Database Link(資料庫連線)來擴充套件訪問,然後在使用如下語句建立資料庫同義詞:

create synonym table_a for [email protected]_Link;


2、oracle dblink建立事例

        oracle在進行跨庫訪問時,可以通過建立dblink實現,如A庫想查B庫的表可以在A庫上建一個DBLINK(單向),不需要在B上建,除非B庫也想查A庫的表;


3、建立dblink語法:

CREATE [PUBLIC] DATABASE LINK link
CONNECT TO username IDENTIFIED BY password
USING ‘connectstring’

說明:
1) 許可權:建立資料庫連結的帳號必須有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系統許可權,
用來登入到遠端資料庫的帳號必須有CREATE SESSION許可權。這兩種許可權都包含在CONNECT角色中
(CREATE PUBLIC DATABASE LINK許可權在DBA中)。一個公用資料庫連結對於資料庫中的所有使用者都是可用的,
而一個私有連結僅對建立它的使用者可用。由一個使用者給另外一個使用者授權私有資料庫連結是不可能的,一個數據庫
連結要麼是公用的,要麼是私有的。

2)link    當GLOBAL_NAME=TRUE時,link名必須與遠端資料庫的全域性資料庫名global_name)相同;
            否則,可以任意命名。

3)connectstring    連線字串,tnsnames.ora中定義遠端資料庫的連線串。

4)username、password:遠端資料庫的使用者名稱,口令。如果不指定,則使用當前的使用者名稱和口令登入到遠端資料庫。


4、賦予許可權

在建立database link之前,我們需要判斷,登陸的使用者是否具備建立database link 的許可權;

database link 分為兩種:一種為 public(公有) 一種為 private(個人)。顧名思義,公有dblink即源庫所有的使用者都可以使用,個人dblink則只有建立者使用者可以使用。
建立dblink是要有相應的許可權的:

[email protected]>select * from user_sys_privs where privilege like upper('%LINK%');
USERNAME             PRIVILEGE               ADM
------------------------------ ---------------------------------    ---
SYS               CREATE DATABASE LINK         NO
SYS               DROP PUBLIC DATABASE LINK      NO
SYS               CREATE PUBLIC DATABASE LINK      NO


5、建立dblink 

建立方的服務端配置遠端資料庫的tnsname配置,當tnsnames檔案中有了引數,且有了相應的許可權之後,就可以建立dblink,建立方式有以下幾種:

建立個人dblink語句為 "CREATE database link "開頭:

create database link test1 using 'test';

建立公有dblink語句"CREATE PUBLIC database link",使用指定的使用者和密碼建立公有 dblink :

create public database link test3 connect to scott identified by tiger using 'test';

建一個shared 的資料庫連線:

create shared public database link test4 connect to scott identified by "tiger" 
authenticated by username identified by "passwd" using 'test';

使用shared方式的 database link是資料庫會限制到遠端資料庫的連線的數量,這樣以避免過多的連線對遠端資料庫造成太大的壓力。


還有一種建立方式是不使用tnsname的情況

CREATE database link link_name
CONNECT TO user IDENTIFIED BY password
USING '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ip)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = sa)
)
)';


6、刪除dblink 

-- 首先需要查詢出來有哪些dblink 
select owner,object_name from dba_objects where object_type='DATABASE LINK';

如果為pubilc則刪除方式為:drop public database link 連結名
如果為個人則刪除方式為:drop database link 連結名


七、例項演示

1、同庫不同使用者演示

如圖所示在wst使用者下有表V_RPT_INSINFO_TJ

image.png

 但是在test使用者沒有這張表,在test使用者下如圖不能訪問表V_RPT_INSINFO_TJ;

image.png

在test使用者下建立私有同義詞:

-- 建立公有同義詞
create public synonym V_RPT_INSINFO_TJ for wst.V_RPT_INSINFO_TJ;

-- 建立私有同義詞
create synonym V_RPT_INSINFO_TJ for wst.V_RPT_INSINFO_TJ;

建立好後就可以在test使用者下訪問wst使用者的表V_RPT_INSINFO_TJ

image.png


2、跨庫同義詞演示

在192.168.81.10庫下使用者cw中並不能訪問V_RPT_INSINFO_TJ,如下圖所示。

image.png

賦予許可權語句

-- 在cw使用者下檢視些當前使用者是否具備建立database link許可權
select * from user_sys_privs where privilege like upper('%DATABASE LINK%') AND USERNAME='CW';

如果查詢有返回行,則表示具備建立database link許可權,否則,則需要使用sys登陸orcl為CW使用者賦予建立許可權

-- 給cw使用者授予建立dblink的許可權
grant create public database link to cw;

grant create database link to cw;


-- 給cw使用者刪除dblink許可權
grant drop public database link to cw;

此時,以cw使用者登入再執行上面檢視是否具備許可權的sql語句,會發現有返回行,表示CW這個使用者已經具備建立database link的許可權

圖片.png


sql建立dblink語句(CW使用者下):

注意一點,如果密碼是數字開頭,用“”括起來(因192.168.81.10伺服器cw使用者下是沒有tnsname檔案,所以採用不使用tnsname情況建立方式)

-- 建立公有dblink
create public database link CWLINK connect to wst identified by "12" USING '192.168.81.10:1521/gbksl';

-- 檢視cw使用者有公用的dblink名稱為"CWLINK"
select * from SYS.ALL_DB_LINKS where db_link='CWLINK';

公有dblink圖示:

3.jpg

圖片.png


-- 建立個人dblink
create database link CWSLINK 
  connect to wst identified by "12"
  using '(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.81.10)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )';
  
-- 檢視cw使用者有私人的dblink名稱為"CWSLINK",如下圖:
select * from SYS.ALL_DB_LINKS where db_link='CWSLINK';

私人dblink圖示:

圖片.png

這樣,就完成了簡單database簡單的建立。cw使用者就可以跨庫查詢的。

建立同義詞

從上一步我們可以看到cw使用者查詢wst使用者的V_RPT_INSINFO_TJ檢視的sql查詢寫起來比較複雜,因為裡面要以@dblink方式才能查詢成功。幸好oracle提供了同義詞的概念,我們可以將"[email protected]"這個長串用一個更簡單的詞(如V_RP,只要不跟cw使用者中的表名衝突就行)來代替,這樣我們就能像查詢普通表/檢視一樣的對V_RP檢視進行查詢了

create synonym V_RP for [email protected]


dblink備註說明:

在上面的dblink描述中我們看到,A(cw)使用者想訪問B(wst)使用者的V_RPT_INSINFO_TJ表或檢視,我們直接通過建立與B(wst)使用者的dblink方式成功在A(cw)使用者中查詢到V_RPT_INSINFO_TJ表或檢視了,但是這樣一來B(wst)使用者中的所有表或檢視都可以被A(cw)使用者通過上面建立的dblink來訪問了,而這點是對於B(wst)使用者來說是不安全的,很多情況下遠端資料庫是不會開放整個使用者B(wst)來給A(cw)使用者訪問的,所以這裡我們需要引入C使用者的來解決這個問題,C使用者是新增的擁有B使用者部分資料訪問許可權的遠端使用者。


在B使用者中建立C使用者並授權。既然需求是實現A使用者能成功訪問B使用者的V_RPT_INSINFO_TJ表或檢視,那麼我們就在B使用者中執行建立C使用者並給C使用者授權B使用者V_RPT_INSINFO_TJ表或檢視的相關許可權,當然connect許可權是必須要有的。C使用者建立完成後我們同樣可以上面講的方式來檢視C使用者的許可權並授權,變換成A使用者中建立與C使用者連線的dblink。