Postgresql

從觸發函式呼叫 dblink

  • December 14, 2016

我有一個環境,​​我必須每天一次將數據從一個數據庫移動到另一個數據庫。我嘗試通過從觸發函式呼叫“dblink”來解決這個問題。

我可以從命令行執行以下語句:

SELECT fieldA, fieldB, fielbC
INTO temp_table
FROM dblink('dbname=dbname port=5432 host=a.b.c.d user=user password=pw', 
           E'SELECT fieldA, fieldB, fieldC FROM data_table') 
    AS temp_table(fieldA integer, fieldB integer, fieldC integer);

但是當試圖將它嵌入到 pgsql 過程中時,它不會起作用。

我正在嘗試使用執行命令:

CREATE OR REPLACE FUNCTION archive() RETURNS trigger AS $$
DECLARE
BEGIN

   execute 
   '
     SELECT fieldA, fieldB, fielbC
     INTO temp_table
     FROM dblink(''dbname=dbname port=5432 host=a.b.c.d user=user password=pw'', 
                 E''SELECT fieldA, fieldB, fieldC FROM data_table'') 
         AS temp_table(fieldA integer, fieldB integer, fieldC integer);
   ';

   return new;
END;
$$ LANGUAGE plpgsql;

我收到一條錯誤消息,告訴我EXECUTE of SELECT ... INTO沒有實現,我可以使用EXECUTE ... INTOEXECUTE CREATE TABLE ... AS

有人有這方面的經驗嗎?我現在掙扎了好幾個小時:-(

由於您的查詢中沒有動態建構任何內容,因此您根本不必使用EXECUTE

在函式體內,您可以簡單地執行INSERTiftemp_table已經存在:

INSERT INTO temp_table (fielda, fieldb, fielbc)
SELECT a, b, c 
 FROM dblink('dbname=dbname port=5432 host=a.b.c.d user=user password=pw', 
             E'SELECT fielda, fieldb, fieldc FROM data_table')
      AS t(a, b, c);

如果該表還沒有,您可以將該INSERT行替換為

CREATE TEMPORARY TABLE AS
...

請注意,在您目前的方法 ( SELECT ... INTO temp_table) 中,正在創建的表不是臨時表,並且在下次執行時,觸發器將遇到錯誤,說明該表已存在。

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