Oracle資料庫通過DBLINK實現遠程訪問

来源:https://www.cnblogs.com/AlanLee/archive/2018/03/12/8548996.html
-Advertisement-
Play Games

什麼是DBLINK? dblink(Database Link)資料庫鏈接顧名思義就是資料庫的鏈接 ,就像電話線一樣,是一個通道,當我們要跨本地資料庫,訪問另外一個資料庫表中的數據時,本地資料庫中就必須要創建遠程資料庫的dblink,通過dblink本地資料庫可以像訪問本地資料庫一樣訪問遠程資料庫表 ...


什麼是DBLINK?

dblink(Database Link)資料庫鏈接顧名思義就是資料庫的鏈接  ,就像電話線一樣,是一個通道,當我們要跨本地資料庫,訪問另外一個資料庫表中的數據時,本地資料庫中就必須要創建遠程資料庫的dblink,通過dblink本地資料庫可以像訪問本地資料庫一樣訪問遠程資料庫表中的數據。

 

如何使用DBLINK?

場景:假設當前資料庫用戶為ALANLEE,此時需要通過ALANLEE這個用戶去採集遠程資料庫的數據。

遠程資料庫信息如下:

HSAJ216 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 12.1.3.216)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = hscsserver)
    )
  )

遠程資料庫用戶名:hs_user,密碼:hundsun

 

第一步:查看用戶是否具備創建database link許可權

--查看ALANLEE用戶是否具備創建database link許可權
select * from user_sys_privs where privilege like upper('%DATABASE LINK%') AND USERNAME='ALANLEE';
select * from user_sys_privs t where t.privilege like upper('%link%');

在資料庫中dblink有這麼一些許可權。例如CREATE DATABASE LINK表示所創建的dblink只能是創建者能使用,別的用戶使用不了,CREATE PUBLIC DATABASE LINK表示所創建的dblink所有用戶都可以使用,DROP PUBLIC DATABASE LINK表示刪除公用dblink的許可權。

假如查出相關的數據則表示ALANLEE用戶具有相關的許可權,如果沒有查出數據則說明ALANLEE用戶沒有相關的許可權。

 

第二步:假如用戶不具備相應的許可權則需要授權,如果ALANLEE用戶具有類似管理員用戶授權的許可權則直接使用當前用戶授權,如果ALANLEE不具備這樣的許可權則使用SYS/SYSTEM之類許可權更大的資料庫用戶來給ALANLEE用戶授權

--需要授予ALANLEE用戶創建資料庫鏈接許可權
grant create public database link to ALANLEE;
--需要授予ALANLEE用戶刪除資料庫鏈接許可權
grant drop public database link to ALANLEE; 

這裡我們使用公共的dblink,即所有用戶都可以使用的dblink,可以根據自己的所需去賦予相應的許可權,授權成功後可以通過第一步的視圖查看是否授權成功。

 

第三步:通過ALANLEE用戶創建遠程資料庫鏈接(資料庫地址:12.1.3.216 用戶名:hs_user 密碼:hundsun)

drop public database link HSAJ216;
create public database link HSAJ216
connect to hs_user identified by hundsun
using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 12.1.3.216)(PORT = 1521)))
(CONNECT_DATA = (SERVICE_NAME = hscsserver)))';

為了避免一些其他的問題,這裡建議直接使用遠程資料庫的全局監聽實例名作為database link的名稱,也就是遠程資料庫信息所示的HSAJ216。

 

第四步:查詢已經建立的資料庫遠程鏈接

select owner,object_name from dba_objects where object_type='DATABASE LINK';

如果有自己創建的database link數據則說明創建成功,反之就是不存在。

 

第五步:測試建立的遠程資料庫鏈接

select * from dual@HSAJ216;

如果能查出東西,則遠程訪問便成功了。

如何查詢遠程資料庫某個用戶某個表的數據呢?sql如下:

select * from hs_asset.client@HSAJ216;

如果能查詢出表的數據,那就可以開始去做數據採集的工作了,查詢出相應的數據,插入本地資料庫的表中。

 

最後一步:通過存儲過程採集遠程資料庫的數據並插入到本地的資料庫當中

/**
*從櫃臺同步客戶數據至臨時表
*/
create or replace PROCEDURE SP_SYNC_CUSTOMER_TEMP (UPDATE_TOTAL OUT NUMBER) IS
  INDEX_COUNT NUMBER;
  INDEX_TOTAL NUMBER;
  CURSOR CR IS
    select a.client_id, --客戶編號
           a.branch_no, --分支機構
           a.id_no, --證件號碼
           a.client_name, --客戶姓名
           a.client_status, --客戶狀態
           a.open_date, --開戶日期
           c.fund_account, --資金賬號
           c.main_flag, --主賬標識
           c.asset_prop, --資產屬性
           b.birthday, --生日日期
           b.address, --地址
           b.home_tel, --家庭電話
           b.e_mail, --郵箱
           b.fax, --傳真
           b.mobile_tel, --手機號碼
           b.office_tel, --單位電話
           b.zipcode, --郵政編碼
           b.account_data --開戶規範信息
      from hs_asset.client@HSAJ216 a
     inner join (select client_id,
                        birthday,
                        address,
                        home_tel,
                        e_mail,
                        fax,
                        mobile_tel,
                        office_tel,
                        zipcode,
                        account_data
                   from hs_asset.clientinfo@HSAJ216
                 union all
                 select client_id,
                        '19000101' as birthday,
                        address,
                        contact_tel as home_tel,
                        e_mail,
                        fax,
                        mobile_tel,
                        contact_tel as office_tel,
                        zipcode,
                        'A' as account_data
                   from hs_asset.organinfo@HSAJ216) b
        on a.client_id = b.client_id
     inner join hs_asset.fundaccount@HSAJ216 c
        on a.client_id = c.client_id
     where c.asset_prop = '0';
BEGIN
  insert into t_coll_result (id, CREATE_DATE, REMARK) 
  values (seq_t_coll_result_id.nextval, sysdate, 'START-現在開始執行【SP_SYNC_CUSTOMER_TEMP】清空客戶同步臨時表TEMP_SYNC_CUSTOMER...');
  EXECUTE IMMEDIATE 'TRUNCATE TABLE TEMP_SYNC_CUSTOMER';
  insert into t_coll_result (id, CREATE_DATE, REMARK) 
  values (seq_t_coll_result_id.nextval, sysdate, 'OVER-【SP_SYNC_CUSTOMER_TEMP】清空客戶同步臨時表TEMP_SYNC_CUSTOMER已完成...');

  insert into t_coll_result (id, CREATE_DATE, REMARK) 
  values (seq_t_coll_result_id.nextval, sysdate, 'START-現在開始執行【SP_SYNC_CUSTOMER_TEMP】向客戶同步臨時表導入數據TEMP_SYNC_CUSTOMER...');
  commit;

  INDEX_COUNT := 1;
  INDEX_TOTAL := 0;
  FOR C IN CR LOOP
    --客戶臨時表
    INSERT INTO TEMP_SYNC_CUSTOMER
      (CODE,
       ORGA_ID,
       ID_CARD,
       NAME,
       CLOSE_STATUS,
       ACCOUNT_CREATE_DATE,
       CAPITAL_ACCOUNT,
       BIRTHDAY,
       ADDRESS,
       TEL,
       BINDING_EMAIL,
       BINDING_MOBILE,
       MAIN_FLAG
       )
    VALUES
      (C.client_id, 
      C.branch_no, 
      C.id_no, 
      C.client_name, 
      C.client_status, 
      C.open_date, 
      C.fund_account, 
      C.birthday, 
      C.address, 
      C.home_tel, 
      C.e_mail, 
      C.mobile_tel,
      C.main_flag);
      
    INDEX_COUNT := (INDEX_COUNT + 1);
    INDEX_TOTAL := (INDEX_TOTAL + 1);
    
    IF INDEX_COUNT > 100000 THEN
      COMMIT;
      insert into t_coll_result (id, CREATE_DATE, REMARK) 
      values (seq_t_coll_result_id.nextval, sysdate, '【SP_SYNC_CUSTOMER_TEMP】已向TEMP_SYNC_CUSTOMER導入' || INDEX_TOTAL || '條數據...');
      commit;
      INDEX_COUNT := 1;
    END IF;
  END LOOP;

  insert into t_coll_result (id, CREATE_DATE, REMARK)
  values (seq_t_coll_result_id.nextval, sysdate, 'OVER-【SP_SYNC_CUSTOMER_TEMP】同步客戶臨時表TEMP_SYNC_CUSTOMER已完成,共導入' || INDEX_TOTAL || '條數據...');
  UPDATE_TOTAL := INDEX_TOTAL; 
  COMMIT;
END SP_SYNC_CUSTOMER_TEMP;

當然,我們不可能每次都手動去執行sql,所以可以結合oracle資料庫的定時任務,在每天的某個時刻自動去執行我們所寫的存儲過程,這樣就相對來說比較完美了。

 

結束語:為了不讓生活留下遺憾和後悔,我們應該儘可能抓住一切改變生活的機會。

 

可愛博主:AlanLee

博客地址:http://www.cnblogs.com/AlanLee

本文出自博客園,歡迎大家加入博客園。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼是操作系統 操作系統包括什麼(kernel) 操作系統結構 ...
  • 預設情況下,安裝完操作系統時,ip是採用dhcp來動態分配的。通常我們需要將其固定下來。 不然 每次系統重啟後,ip都會變動,這樣會給日常工作帶來不必要的麻煩的。 下麵就是在rhel 、centos 下,如何固定Ip. 1、使用ifconfig命令,查看有哪些網路介面。 例如上面的ens33, lo ...
  • 磁碟陣列(Redundant Arrays of Independent Disks,RAID),有“獨立磁碟構成的具有冗餘能力的陣列”之意。 磁碟陣列是由很多價格較便宜的磁碟,組合成一個容量巨大的磁碟組,利用個別磁碟提供數據所產生加成效果提升整個磁碟系統效能。利用這項技術,將數據切割成許多區段,分 ...
  • 查詢語句的處理主要包括三個過程:編譯(parse)、執行(execute)和提取數據(fetch)。 ...
  • 一提到關係型資料庫,我禁不住想:有些東西被忽視了。關係型資料庫無處不在,而且種類繁多,從小巧實用的 SQLite 到強大的 Teradata 。但很少有文章講解資料庫是如何工作的。你可以自己谷歌/百度一下『關係型資料庫原理』,看看結果多麼的稀少【譯者註:百度為您找到相關結果約1,850,000個…】 ...
  • MySQL的MyISAM、InnoDB引擎預設均使用B+樹索引(查詢時都顯示為“BTREE”),本文討論兩個問題: 為什麼MySQL等主流資料庫選擇B+樹的索引結構? 如何基於索引結構,理解常見的MySQL索引優化思路? 為什麼索引無法全部裝入記憶體 索引結構的選擇基於這樣一個性質:大數據量時,索引無 ...
  • 前言 這邊文章,筆者要分享的是如何在我們的Linux系統中安裝我們的Mysql資料庫。 一、Mysql安裝 1.1下載資源並上傳到虛擬機上 1.1.1下載資源 官網下載資源:點我跳轉到資料庫下載官網 因為筆者使用的系統是centOS,所以下載的是red hat相關的資料庫系統: 當然了筆者下載的版本 ...
  • HDFS體繫結構 1<!--[if gte mso 9]><xml> <w:data>08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F006300350030003800360033003400350039003 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...