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
但是在test使用者沒有這張表,在test使用者下如圖不能訪問表V_RPT_INSINFO_TJ;
在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
2、跨庫同義詞演示
在192.168.81.10庫下使用者cw中並不能訪問V_RPT_INSINFO_TJ,如下圖所示。
賦予許可權語句
-- 在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的許可權
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圖示:
-- 建立個人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圖示:
這樣,就完成了簡單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。