Postgresql
從觸發函式呼叫 dblink
我有一個環境,我必須每天一次將數據從一個數據庫移動到另一個數據庫。我嘗試通過從觸發函式呼叫“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 ... INTO
或EXECUTE CREATE TABLE ... AS
有人有這方面的經驗嗎?我現在掙扎了好幾個小時:-(
由於您的查詢中沒有動態建構任何內容,因此您根本不必使用
EXECUTE
。在函式體內,您可以簡單地執行
INSERT
iftemp_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
) 中,正在創建的表不是臨時表,並且在下次執行時,觸發器將遇到錯誤,說明該表已存在。