網(wǎng)站源碼綁定域名萬秀服務(wù)不錯(cuò)的seo推廣
1.Database Link介紹
Database Link簡(jiǎn)稱DBLink,是數(shù)據(jù)庫(kù)管理系統(tǒng)提供的用于訪問外部數(shù)據(jù)庫(kù)對(duì)象的機(jī)制。用于可以通過DBLink來訪問外部數(shù)據(jù)庫(kù)的表、視圖對(duì)象。DBLink實(shí)現(xiàn)了兩個(gè)數(shù)據(jù)庫(kù)之間的通信。DBLink包含一個(gè)基于網(wǎng)絡(luò)的數(shù)據(jù)連接以及用于登陸遠(yuǎn)程數(shù)據(jù)庫(kù)的用戶名、密碼信息。本地?cái)?shù)據(jù)庫(kù)系統(tǒng)可以通過DBLink建立與遠(yuǎn)程數(shù)據(jù)庫(kù)之間的會(huì)話,從而完成對(duì)遠(yuǎn)程數(shù)據(jù)庫(kù)對(duì)象的訪問。DBLink實(shí)現(xiàn)了SQL/MED標(biāo)準(zhǔn)中定義的對(duì)外部數(shù)據(jù)源進(jìn)行訪問的部分功能。
? Note:
SQL/MED是SQL Management of External Data的縮寫,是ISO/IEC 9075-9:2003標(biāo)準(zhǔn)中對(duì)SQL語(yǔ)言的擴(kuò)展。SQL/MED標(biāo)準(zhǔn)規(guī)定了如何通過外部數(shù)據(jù)封裝器(Foreign Data Wrapper)和數(shù)據(jù)連接(datalink)實(shí)現(xiàn)對(duì)外部數(shù)據(jù)的訪問。這里的外部數(shù)據(jù)指的是可以被基于SQL的DBMS訪問的數(shù)據(jù)。
dblink對(duì)象是一個(gè)數(shù)據(jù)庫(kù)內(nèi)部對(duì)象,可以通過dblink對(duì)象連接引用其他數(shù)據(jù)庫(kù)的對(duì)象。支持連接Oracle、Kingbase和Postgresql的dblink對(duì)象。
相關(guān)定義如下:
本地?cái)?shù)據(jù)庫(kù):當(dāng)前數(shù)據(jù)庫(kù)客戶端所連接到的數(shù)據(jù)庫(kù),可以直接訪問和操作在此數(shù)據(jù)庫(kù)內(nèi)擁有相應(yīng)權(quán)限的對(duì)象,客戶端持有該連接。
遠(yuǎn)程數(shù)據(jù)庫(kù):通過定義于本地?cái)?shù)據(jù)庫(kù)內(nèi)的dblink訪問的數(shù)據(jù)庫(kù),雖然客戶端看起來可以直接訪問遠(yuǎn)程數(shù)據(jù)庫(kù)的對(duì)象,實(shí)際上此類連接由本地?cái)?shù)據(jù)庫(kù)持有,對(duì)象定義等系統(tǒng)信息在本地?cái)?shù)據(jù)庫(kù)并不存在。遠(yuǎn)程數(shù)據(jù)庫(kù)也可能只是本地?cái)?shù)據(jù)庫(kù)通過設(shè)置連接到了自己的另一個(gè)服務(wù)進(jìn)程或者線程。
遠(yuǎn)程連接:通過dblink訪問遠(yuǎn)程數(shù)據(jù)庫(kù)對(duì)象時(shí)創(chuàng)建的數(shù)據(jù)庫(kù)連接,對(duì)于目標(biāo)數(shù)據(jù)庫(kù),本地?cái)?shù)據(jù)庫(kù)是它為之提供服務(wù)的客戶端。本地?cái)?shù)據(jù)庫(kù)對(duì)自己創(chuàng)建和擁有的遠(yuǎn)程連接,需要進(jìn)行合理的管理,在必要時(shí)應(yīng)及時(shí)關(guān)閉,防止過多的資源開銷。
遠(yuǎn)程表(視圖、物化視圖):存在于遠(yuǎn)程數(shù)據(jù)庫(kù)上的表,也可能是視圖或者物化視圖,本地?cái)?shù)據(jù)庫(kù)對(duì)此并不關(guān)心,只關(guān)心所取得的數(shù)據(jù)結(jié)構(gòu)定義和數(shù)據(jù)本身。
遠(yuǎn)程序列:存在于遠(yuǎn)程數(shù)據(jù)庫(kù)上的序列發(fā)生器,通常用于統(tǒng)一id的生成。
遠(yuǎn)程函數(shù)(存儲(chǔ)過程):存在于遠(yuǎn)程數(shù)據(jù)庫(kù)上的函數(shù)或者存儲(chǔ)過程,一般遠(yuǎn)程調(diào)用函數(shù)的場(chǎng)景居多。
遠(yuǎn)程同義詞:存在于本地?cái)?shù)據(jù)庫(kù)指向遠(yuǎn)程對(duì)象(表、序列、函數(shù)等等)的同義詞。
2.?Database Link功能
Dblink功能主要是為了滿足常見語(yǔ)法的適配,讓用戶應(yīng)用的代碼能夠適用于更寬泛的產(chǎn)品而無需在移植時(shí)大量修改:
支持連接管理,在適當(dāng)?shù)臅r(shí)候關(guān)閉連接減少遠(yuǎn)程數(shù)據(jù)庫(kù)的資源開銷。
支持遠(yuǎn)程表(視圖、物化視圖)的查詢,并且支持下推查詢條件減少數(shù)據(jù)傳輸?shù)木W(wǎng)絡(luò)開銷。
支持遠(yuǎn)程表的插入。
支持遠(yuǎn)程序列的訪問。
3.?創(chuàng)建Database Link對(duì)象
在創(chuàng)建dblink對(duì)象時(shí)指定連接信息,包括遠(yuǎn)程數(shù)據(jù)庫(kù)網(wǎng)絡(luò)地址、端口、數(shù)據(jù)庫(kù)名稱、用戶名和密碼,具體需要提供哪些信息會(huì)因?yàn)椴煌瑪?shù)據(jù)庫(kù)存在差異。
語(yǔ)法格式:
CREATE [ PUBLIC ] DATABASE LINK dblinkCONNECT TO user IDENTIFIED BY password USING{(connect_string) | config_tag };
參數(shù)說明:
PUBLIC
指定PUBLIC創(chuàng)建公有dblink對(duì)象,所有用戶都可以訪問公有dblink對(duì)象。公有dblink是創(chuàng)建在PUBLIC模式下面的。未指定PUBLIC時(shí)創(chuàng)建私有dblink,不可在PUBLIC模式下創(chuàng)建私有dblink。
dblink
指定要?jiǎng)?chuàng)建的數(shù)據(jù)庫(kù)鏈接的名稱,同一個(gè)模式下的dblink不能重名。
user?IDENTIFIED?BY?password
指定遠(yuǎn)端數(shù)據(jù)庫(kù)的用戶名和密碼。
connect_string
配置連接串信息,
connect_string
用來提供用于連接到遠(yuǎn)程數(shù)據(jù)庫(kù)的信息。
config_tag
配置文件標(biāo)簽名,用于指明配置文件(sys_database_link.conf)中的一項(xiàng),從而通過配置文件獲取用于建立數(shù)據(jù)庫(kù)連接的遠(yuǎn)程數(shù)據(jù)庫(kù)的網(wǎng)絡(luò)地址、端口以及數(shù)據(jù)庫(kù)名稱。
注解:
1、在配置文件中的格式如下:
[名稱]
DriverName=連接驅(qū)動(dòng)名稱。
Host=遠(yuǎn)程數(shù)據(jù)庫(kù)網(wǎng)絡(luò)地址。
Port=遠(yuǎn)程數(shù)據(jù)庫(kù)服務(wù)端口。
Dbname=遠(yuǎn)程數(shù)據(jù)庫(kù)名稱。
DbType=遠(yuǎn)程數(shù)據(jù)庫(kù)類型。
DbType支持Oracle,Kingbase,Postgres三種數(shù)據(jù)庫(kù)類型。
2、使用該功能時(shí),需將kdb_database_link加入shared_preload_libraries中。
3、查詢外部數(shù)據(jù)庫(kù)時(shí),需創(chuàng)建對(duì)應(yīng)的數(shù)據(jù)庫(kù)插件,如:kingbase_fdw、oracle_fdw、postgres_fdw。
舉例:
創(chuàng)建一個(gè)到Oracle數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)連接,它可以被所有數(shù)據(jù)庫(kù)用戶使用:
CREATE PUBLIC DATABASE LINK mylink CONNECT TO ‘SYSTEM’ IDENTIFIED BY ‘password’ USING 'ORADB';創(chuàng)建一個(gè)到Oracle數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)連接,直接指定連接串信息:
CREATE PUBLIC DATABASE LINK mylink CONNECT TO ‘SYSTEM’ IDENTIFIED BY ‘password’ USING (DriverName=’Oracle ODBC Driver’, Host=192.168.0.1, Port=1521, Dbname=TEST, DbType=Oracle);
4.?修改Database Link對(duì)象
ALTER?DATABASE?LINK
修改一個(gè)dblink數(shù)據(jù)庫(kù)對(duì)象。
第一種形式更改dblink的擁有者,要修改擁有者,你必須擁有該dblink并且也是新?lián)碛薪巧囊粋€(gè)直接或間接成員。
第二種形式更改dblink的名稱,只有dblink擁有者或者超級(jí)用戶可以重命名一個(gè)dblink。
語(yǔ)法格式:
ALTER [PUBLIC] DATABASE LINK dblink_name OWNER TO new_owner; ALTER [PUBLIC] DATABASE LINK dblink_name RENAME TO new_name;
參數(shù)說明:
dblink_name
一個(gè)現(xiàn)有dblink的名稱(可以是模式限定的)。
new_owner
該dblink的新?lián)碛姓叩挠脩裘?/p>
dblink_name
該dblink的新名稱。
注解:
ALTER?DATABASE?LINK
語(yǔ)法類似于ALTER VIEW。
舉例:
把
DATABASE?LINK
kdb_dblink_regress.link_d擁有者修改為 kdb_dblink_user:ALTER DATABASE LINK kdb_dblink_regress.link_d OWNER TO kdb_dblink_user;
兼容性:
ALTER?DATABASE?LINK
語(yǔ)句是一個(gè)KingbaseES擴(kuò)展。
5.?刪除Database Link對(duì)象
DROP?DATABASE?LINK
移除一個(gè)dblink。要執(zhí)行這個(gè)命令必須擁有該dblink的權(quán)限。
語(yǔ)法格式:
DROP DATABASE LINK dblink_name
參數(shù)說明:
dblink_name
刪除名為dblink_name的
DATABASE?LINK
注解:
DBLink可以被擁有者和DBA刪除,刪除DBLink對(duì)象之后,所有的用戶會(huì)話中的對(duì)象都會(huì)被清除。
如果DBLink正在被其他用戶使用,則無法刪除此DBLink。
暫不支持PUBLIC關(guān)鍵字。
兼容性:
該命令是KingbaseES的一個(gè)擴(kuò)展,兼容Oracle。
6.?Database Link的權(quán)限控制
對(duì)于私有的DBLink,其創(chuàng)建者和DBA具有對(duì)此DBLink對(duì)象進(jìn)行訪問的權(quán)限。除DBLink創(chuàng)建者之外的其他數(shù)據(jù)庫(kù)用戶可以對(duì)以PUBLIC方式建立的DBLink進(jìn)行訪問。
本地用戶對(duì)遠(yuǎn)程數(shù)據(jù)庫(kù)對(duì)象的訪問權(quán)限由遠(yuǎn)程數(shù)據(jù)庫(kù)系統(tǒng)的用戶認(rèn)證機(jī)制來控制。通過DBLink連接到遠(yuǎn)程數(shù)據(jù)庫(kù)的本地用戶將得到遠(yuǎn)程數(shù)據(jù)庫(kù)的用戶擁有的查詢權(quán)限。
7.?DBLink相關(guān)的視圖
DBLink向用戶提供的視圖如下:
名稱 | 說明 |
ALL_DB_LINKS | 描述當(dāng)前用戶可以訪問的所有數(shù)據(jù)庫(kù)連接 |
USER_DB_LINKS | 描述當(dāng)前用戶擁有的所有數(shù)據(jù)庫(kù)連接 |
DBA_DB_LINKS | 描述DBA可以訪問的所有數(shù)據(jù)庫(kù)連接 |
8.?DATABASE LINK DML
DATABASE LINK — dblink 的DML操作
語(yǔ)法格式:
INSERT
[ WITH [ RECURSIVE ] with_query [, ...] ] INSERT INTO table_name@dblink [ AS alias ] [ ( column_name [, ...] ) ][ OVERRIDING { SYSTEM | USER} VALUE ]{ VALUES ( { expression } [, ...] ) [, ...] | query }[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]UPDATE
[ WITH [ RECURSIVE ] with_query [, ...] ] UPDATE table_name@dblink [ * ] [ [ AS ] alias ]SET { column_name = { expression } |( column_name [, ...] ) = [ ROW ] ( { expression } [, ...] ) |( column_name [, ...] ) = ( sub-SELECT )} [, ...][ FROM from_list ][ WHERE condition ][ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]DELETE
[ WITH [ RECURSIVE ] with_query [, ...] ] DELETE FROM table_name@dblink [ * ] [ [ AS ] alias ][ WHERE condition ][ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
描述:
使用dblink對(duì)遠(yuǎn)程表進(jìn)行插入,更新,刪除。
參數(shù):
dblink
dblink的名稱,使用
CREATE?DATABASE?LINK
創(chuàng)建的dblink數(shù)據(jù)庫(kù)連接的名稱。
with_query
WITH
子句允許你指定一個(gè)或者多個(gè)子查詢,在INSERT
?UPDATE
?DELETE
?查詢中可以用子查詢的名字來引用它們 詳見?WITH查詢(公共表表達(dá)式)?和?SELECT?。
table_name
一個(gè)已有表的名稱(可以被模式限定)。
alias
目標(biāo)表名的替補(bǔ)名稱。當(dāng)提供了一個(gè)別名時(shí),它會(huì)完全隱藏掉表的實(shí)際名稱。
column_name
名為
table_name
?的表中的一個(gè)列 的名稱,可以用表名(可以被模式名限定)做限定。如有必要,列名還可以用一個(gè)子域名(子域名需要和表名、模式名一同用小括號(hào)包圍起來進(jìn)行限定)或者數(shù)組下標(biāo)限定。
expression
要賦予給相應(yīng)列的表達(dá)式或者值。
output_expression
在每一行被插入或更新或刪除后由
INSERT
或UPUDATE
或?DELETE
命令計(jì)算并且返回的 表達(dá)式。該表達(dá)式可以使用``table_name``?指定的表中的任何列。寫成*
可返回被插入或更新或刪除行的所有列。
output_name
要用于被返回列的名稱。
condition
一個(gè)能返回
boolean
值的表達(dá)式。只有讓這個(gè)表達(dá)式返回?true
的行才將被更新,刪除。
使用限制:
INSERT
遠(yuǎn)端表插入操作不支持ON CONFLICT子句
不支持顯示指定生成列的值
對(duì)于RETURNING,不支持RETURNING ctid等系統(tǒng)列
暫不支持列的默認(rèn)值,對(duì)于有默認(rèn)值的遠(yuǎn)程表,在進(jìn)行insert的時(shí)候,如果顯式使用例如insert into {tablename} default value或者insert into {tablename} values(default)會(huì)報(bào)錯(cuò)dblink not support insert with default value;如果insert into的時(shí)候,沒有指定全部的列也會(huì)報(bào)上面的錯(cuò)誤比如當(dāng)表tab有兩列a, b的時(shí)候,那么下面sql都會(huì)報(bào)錯(cuò)
insert into?tab@dblink?values(1)
insert into tab@dblink(a) values(1)
insert into?tab@dblink?select a from tab
insert into tab@dblink(a) select a from tab
UPDATE
當(dāng)遠(yuǎn)端表為繼承表時(shí),不支持僅更新父表數(shù)據(jù),指定ONLY關(guān)鍵字時(shí)報(bào)錯(cuò)
對(duì)于RETURNING,不支持RETURNING ctid等系統(tǒng)列
目前update不支持列的默認(rèn)值,在進(jìn)行update的時(shí)候,如果顯式的指定使用默認(rèn)值,比如update {tablenaem} set {columname}=default,會(huì)報(bào)錯(cuò)dblink not support insert with default value
目前不支持?
WHERE?CURRENT?OF?cursor_name
?的用法目前update對(duì)于?
分區(qū)表
?和?繼承表
?的行為表現(xiàn)不確定,所以禁止使用dblink更新遠(yuǎn)程?分區(qū)表
?或者?繼承表
?中的數(shù)據(jù)DELETE
當(dāng)遠(yuǎn)端表為繼承表時(shí),不支持僅刪除父表數(shù)據(jù),指定ONLY關(guān)鍵字時(shí)報(bào)錯(cuò)
對(duì)于RETURNING,不支持RETURNING ctid等系統(tǒng)列
目前delete對(duì)于?
分區(qū)表
?和?繼承表
?的行為表現(xiàn)不確定,所以禁止使用dblink刪除遠(yuǎn)程?分區(qū)表
?或者?繼承表
?中的數(shù)據(jù)
ORACLE兼容:
當(dāng)dblink創(chuàng)建的數(shù)據(jù)庫(kù)連接是連接到Oracle的時(shí)候,除了以上的使用限制外,目前dblink還不支持UPDATE和DELETE
9.?DATABASE LINK MERGE
DATABASE LINK — dblink 的MERGE操作
語(yǔ)法格式:
MERGE INTO [ schema. ] { target_table@dblink } [ [ AS ] target_table_alias ]USING { [ schema. ] { source_table } [ [ AS ] source_table_alias ]ON ( condition_expression ) [ merge_update_clause ] [ merge_insert_clause ];merge_update_clause: WHEN MATCHED THEN UPDATE SET column = { expr }[, column = { expr } ]... [ where_clause ] [ delete_clause ]delete_clause: [DELETE where_clause]merge_insert_clause: WHEN NOT MATCHED THEN INSERT [ ( column [, column ]...) ] VALUES ({ expr }[, { expr } ]...) [ where_clause ]where_clause: WHERE condition
描述:
使用dblink對(duì)遠(yuǎn)程表進(jìn)MERGE操作。
參數(shù):
target_table
MERGE遠(yuǎn)程目標(biāo)表的名稱。
dblink
dblink的名稱,使用
CREATE?DATABASE?LINK
創(chuàng)建的dblink數(shù)據(jù)庫(kù)連接的名稱。
source_table
MERGE源表的名稱。源表可以是一個(gè)本地表,普通外表,也可以是一個(gè)dblink的遠(yuǎn)程表,即tablename@dblinkname。
target_table_alias
MERGE目標(biāo)表的別名。
source_table_alias
MERGE源表的別名。
expr
要賦予給相應(yīng)列的表達(dá)式或者值。
condition_expression
指定目標(biāo)表與源表之間進(jìn)行聯(lián)接的聯(lián)接條件。如果該條件為真,且指定了 WHEN MATCHED THEN UPDATE 子句,則對(duì)匹配到的目標(biāo)表的該元組執(zhí)行更新操作;否則,如果該條件為假且指定了 WHEN NOT MATCHED THEN INSERT 子句,則對(duì)目標(biāo)表執(zhí)行插入操作。
merge_update_clause
當(dāng)目標(biāo)表和源表的ON條件為真時(shí),執(zhí)行該子句,即更新目標(biāo)表數(shù)據(jù)。該更新操作會(huì)觸發(fā)目標(biāo)表上面的觸發(fā)器。更新的列不能是ON條件中被引用的列,更新時(shí)可以通過WHERE條件指明要更新的行,條件中既可以包含源表的列,也可以包含目標(biāo)表的列,當(dāng)指明WHERE條件且條件為假時(shí),則不更新。
delete_clause
DELETE子句只刪除目標(biāo)表和源表的ON條件為真、并且是更新后的符合刪除條件的記錄,DELETE子句不影響INSERT項(xiàng)插入的行。刪除條件作用在更新后的記錄上,既可以和源表相關(guān),也可以和目標(biāo)表相關(guān),或者都相關(guān)。如果ON條件為真,但是不符合更新條件,并沒有更新數(shù)據(jù),那么DELETE將不會(huì)刪除任何數(shù)據(jù)。
merge_insert_clause
當(dāng)目標(biāo)表和源表的ON條件為假時(shí),執(zhí)行該語(yǔ)句??芍付ú迦霔l件,插入時(shí)的WHERE條件只能引用源表中的列。VALUES后面也只能引用源表中的列,不能包含目標(biāo)表的列。