Firebird

外部數據源為 localhost 的 Firebird 執行塊

  • May 10, 2018

我正在編寫一個 .net 應用程序,它連接到託管在 Internet 上的遠端數據庫伺服器以進行某種複制。

數據庫源在我的本地 firebird 伺服器上,目標數據庫在託管在 Internet 上的 Firebird 伺服器上

這是查詢

execute block as DECLARE panum INT; DECLARE nom varchar(50); DECLARE prenom 
varchar(50); DECLARE dna date; DECLARE datemodif date; DECLARE VARIABLE VSQL 
VARCHAR(500); begin VSQL = 'select panum, nom, prenom, dna, DATEMODIF from 
patient where (datemodif is not null) and (datediff (day from current_date 
to cast(DATEMODIF as date)) >= 0) ';


FOR execute statement VSQL ON EXTERNAL DATA SOURCE 
'127.0.0.1:C:\BDD\D2018.gdb' 
AS USER 'sysdba' PASSWORD 'masterkey' INTO :panum, :nom, :prenom, :dna, 
:DATEMODIF DO  

merge into patient bb using (select :panum panum, :nom nom, :prenom prenom, 
:dna dna, :DATEMODIF datemodif  from RDB$DATABASE ) n on bb.panum = n.panum 
when matched 
then update set bb.nom = :nom, bb.prenom = :prenom, bb.dna = :DNA, 
bb.DATEMODIF = :DATEMODIF when not matched 
then insert(panum, nom, prenom, dna, datemodif) values(:panum, :nom, 
:prenom, :dna, :datemodif);

suspend;  end; 

兩台伺服器都在 Windows 64 機器上執行 Firebird 3.0.3。

它失敗並顯示此錯誤消息:

嘗試打開文件 12515659 時出錯:系統找不到指定的路徑。數據來源:火鳥::127.0.0.1:C:\BDD\D2018.gdb

我還嘗試了 localhost 和我的本地 IP 地址以及伺服器名稱。

如果我翻轉方向,那麼我的源數據庫是遠端伺服器,目標是我的本地伺服器**,它可以工作**。

我知道這有點奇怪,但我這樣做有一些限制。

如果我從您的評論中理解正確,則執行塊是在外部伺服器上執行的,它需要從本地伺服器查詢數據。

您的程式碼的問題 - 據我所知 - 是您似乎認為 IP 地址是從啟動執行的程序的角度解決的(因此 127.0.0.1 將是您的本地數據庫)。不是的,地址解析是從執行程序的角度來看的execute block(在這種情況下:外部伺服器上的 Firebird 程序,所以 127.0.0.1 是那個外部伺服器)。

您需要將 127.0.0.1 替換為本地伺服器的 IP 地址才能正常工作。這個 IP 地址應該是公共的,或者至少可以從外部伺服器訪問。

但請注意,如果您將本地和外部伺服器都暴露給公共網際網路,則會存在安全風險。考慮使用 VPN 連接本地和外部伺服器。

引用自:https://dba.stackexchange.com/questions/206166