# DBLink ###### tags: `Oracle` `SQL` 用途:讀取資料庫的資料 注意事項 1.防火牆是否有開 2.是否有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK權限 3.connectstring > tnsnames.ora(在Win環境下的Oracle中,Oracle\Network\ADMIN\tnsnames.ora )中 定義遠程資料庫的連線字串 /或在SQL中寫入 4.username、password 如果不指定則使用當前的帳密登入到遠端資料庫 5.全域數據庫名稱 SELECT * FROM GLOBAL_NAME ALTER SYSTEM SET GLOBAL_NAME=TRUE/FALSE; 當FALSE時就不要求數據庫連接名稱跟遠端數據庫名稱(global_name)一樣 重啟才有效果 6.分為公有/私有 公有的有public修飾字 create drop 都要加上 公有DB_LINK對所有人開放 在DB_LINK之上的同義字也都開放 私有DB_LINK只有建立者可訪問 需為用戶建立視圖並將視圖授權給用戶 7.不能將帶有DB_LINK的同義詞直接授權給用戶否則ERROR grant select on table1@user1 to user2 ERROR at line 1: ORA-02021: DDL operations are not allowed on a remote database 8.創建DB_LINK時使用連接字串效率較高 9.使用了DB_LINK 皆會產生Exclusive Lock 即便只時查詢 (目前測試 查詢不會上鎖 但建議還是執行提交或復原) 使用DB_LINK查詢等同於在locale執行 select * from table for update 原因 Oracle在執行分佈式SQL語句時,無論是查詢語句還是DML語句,都被認爲是一項事務, 爲了支持兩段式(two-phase)提交處理而使用了回滾段空間。因此,在事務上加了分佈式事務鎖(DX), 只有提交或回滾本次事務後才能解除此鎖。如果不提交或回滾本次事務,該事務佔用的回滾段空間就不會釋放 解決方法 1.dbms_session.close_database_link(CONN_MY_LINK); 2.COMMIT OR ROLLBACK 建立DB_LINK CREATE [PUBLIC] DATABASE LINK link CONNECT TO username IDENTIFIED BY password USING ‘connectstring OR SID’ create database link linkfwq connect to fzept identified by neu using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.142.202.12)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = fjept) ) )'; HOST 為主機IP SERVICE_NAME 為SSID fzept 為遠端資料庫帳號 neu 為遠端資料庫密碼 刪除DB_LINK DROP [PUBLIC] DATABASE LINK zrhs_link 查詢DB_LINK select * from DBA_DB_LINKS; select * from ALL_DB_LINKS; select owner,object_name from dba_objects where object_type='DATABASE LINK'; 使用DB_LINK [user.]table|view@dblink 同義詞(別名) 建立: 同義詞可建立以下物件 表格 檢視 實體化檢視 索引 序列 同義字 預儲程序 預儲函數 外部程序 Java 類別關聯 指定 PUBLIC 關鍵字可建立公用同義字,可建立任何使用者都能參照公用同義字,若省略不指定, 則為私有同義字,表示建立的私有同義字只在建立的使用者結構內有效 CREATE [PUBLIC] SYNONYM [schema.]synonym_name FOR [schema.]object_name; schema : 結構名稱 synonym_name : 同義字名稱 object_name : 目標物件名稱 查詢: SELECT synonym_name,table_name,table_owner FROM DBA_SYNONYMS 建立遠程view CREATE VIEW worker AS SELECT * FROM worker@zrhs_link where…; 需注意權限問題 檢視當前使用者具有哪些針對DBLINK的許可權的方法: SELECT DISTINCT PRIVILEGE AS "Database Link Privileges" FROM ROLE_SYS_PRIVS WHERE PRIVILEGE IN ( 'CREATE SESSION','CREATE DATABASE LINK','CREATE PUBLIC DATABASE LINK');
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up