Postgresql

如何將函式保存到 PostgreSQL 中的單個文件?

  • December 19, 2018

我維護一個使用 PostgreSQL 數據庫的遺留應用程序。

該應用程序嚴重依賴於儲存過程(又名函式)。

我想將這些函式保存到以函式名稱命名的文件中,這樣我就可以使用 VCS(版本控制系統)。

我知道我可以ALTER FUNCTION使用 using保存程式碼,PgAdmin但這只能讓我一次保存一個函式。

我正在尋找一種自動保存所有功能的方法。有什麼方法可以編寫此任務的腳本嗎?

我使用 pg_get_functiondef 編寫了一個簡單的 PHP 腳本來獲取原始碼,然後將其保存到文件中。

$connection = pg_connect("connection string details");
$result = pg_query($connection, "select proname, pg_get_functiondef(oid) from pg_proc where pronamespace=<namespace_oid>");

while ($row = pg_fetch_row($result)) {
   $fp = fopen("{$row[0]}.sql", 'w');
   fwrite($fp, $row[1]);
}

執行以下

  1. mkdir /tmp/foo
  2. chown postgresql:postgresql /tmp/foo

然後,執行這個命令,我無恥地從克雷格關於 SO 的回答中psql竊取了它的內部工作原理,

SELECT FORMAT(
 'COPY (SELECT pg_get_functiondef(%s)) TO ''/tmp/foo/%s''',
 pp.oid,
 pp.proname
)
from pg_proc pp
inner join pg_namespace pn on (pp.pronamespace = pn.oid)
inner join pg_language pl on (pp.prolang = pl.oid)
where pl.lanname NOT IN ('c','internal') 
 and pn.nspname NOT LIKE 'pg_%'
 and pn.nspname <> 'information_schema';

然後執行\gexec

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