2017-03-02 35 views
0

我有一個多租戶應用程序,其中租戶在同一個數據庫中的不同模式上設置。原因是他們有一些共享數據,他們在一個模式中使用。Postgres針對多個模式運行語句

到目前爲止,我一直在使用一個bash腳本,並在其中添加了一個模式列表,每當添加一個新模式時都需要更新,並且我需要執行跨帳戶的表模式更改等操作。例如添加一個新列到表中。

是否有Postgres的,PSQL等方式......比如

ALTER TABLE some_table ADD COLUMN some_column TEXT NOT NULL DEFAULT ''; 

無需做字符串替換在諸如bash例如另一個腳本運行。

換言之,是否有足夠簡單的方法來獲取模式,並在psql中寫入for循環,該循環將遍歷模式並通過設置search_path來運行語句。

原因是租戶數量不斷增加,新租戶可以由不是開發人員的管理員用戶添加,所以我不斷更新我的shell腳本。這隻會成倍增長。有沒有處理這類問題的標準方法?

+0

是的,您可以在主模式(posgres)上創建一個過程獲取所有schem就像在INFORMATION_SCHEMA模式中一樣,並且讓你的更改運行它的命令 –

回答

3

你可以做一點點PL/pgSQL的塊:

do 
$$ 
declare 
    s_rec record; 
begin 
    for s_rec in select schema_name 
       from information_schema.schemata 
       where schema_name not in ('pg_catalog', 'information_schema') 
    loop 
    execute format ('ALTER TABLE if exists %I.some_table ADD COLUMN some_column TEXT NOT NULL DEFAULT ''''), s_rec.schema_name); 
    end loop; 
end; 
$$ 

if exists將確保如果表中不存在的模式聲明不會失敗。


如果過於簡化了您的問題,並希望實際上對每個方案運行完整的腳本一次,生成包含實際腳本每個模式的腳本是可能更容易:

select concat(format('set search_path = %I;', schema_name), 
       chr(10), 
       '\i complete_migration_script.sql') 
from information_schema.schemata 
where schema_name not in ('pg_catalog', 'information_schema') 

你可以將該語句的輸出轉換爲文件,然後使用psql運行該文件(當然,您需要用腳本的實際名稱替換complete_migration_script.sql

+0

令人驚訝的是,我實際上需要你提供的兩個例子。謝謝!!! –