Postgresql

在一個腳本中刪除多個數據庫

  • July 24, 2019

我試圖弄清楚如何在一個 sql 腳本中刪除 PostgreSQL 上的多個數據庫。我最好需要它在pgAdmin控制台中執行時以及在psql命令行工具中使用時都能正常工作。當我做:

DROP DATABASE db1;
DROP DATABASE db2;

我收到以下錯誤:

不能從函式或多命令字元串執行 DROP DATABASE

有沒有辦法解決這個問題?即,是否有任何方法可以單獨執行每個命令(例如在 MSSQL 上使用“GO”語句時),或者其他一些明智的方法來輕鬆刪除多個數據庫?我在開發過程中需要此功能來維護腳本。

pgAdmin中的腳本中執行多個命令時,它們會自動包裝到事務中。您可以顯式begin處理commit事務,但不能使用不會在事務上下文中執行的命令。手冊:

DROP DATABASE不能在事務塊內執行。

在psql中使用 呼叫時類似-c command手冊:

如果命令字元串包含多個 SQL 命令,則在單個事務中處理它們,除非字元串中包含顯式 BEGIN/COMMIT命令將其劃分為多個事務。

但是,當通過標準輸入輸入psql時:

這與從文件中讀取相同字元串或將其饋送到 psql 的標準輸入時的行為不同,因為 psql 分別發送每個 SQL 命令。

由於這種行為,將多個 SQL 命令放在一個-c字元串中通常會產生意想不到的結果。最好使用重複的-c命令或將多個命令提供給 psql 的標準輸入,或者使用上面所示的 echo,或者通過 shell here-document,例如:

psql <<EOF
\x
SELECT * FROM foo;
EOF

因此,您可以在預設自動送出模式下將 psql 與標準輸入一起使用。

否則,您只能執行單獨的命令

您可以使用 shell 命令dropdb- 或使用它編寫一個刪除多個數據庫的 shell 腳本。

順便說一句,您可以從 pgAdmin 和 psql 執行的唯一區別是 psql 的元命令——它們不是 SQL。這些是由 psql 而不是數據庫引擎解釋的。要在元命令和 SQL 之間切換,請使用分隔符 meta-command \\。手冊中有一個例子

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