在多个数据库postgres中更改表

时间:2013-01-25 09:33:15

标签: database postgresql shell alter-table

我有多个数据库,每个都有表“身份验证”。在每个表中,我想删除一个约束并用一个约束替换它。如果我不想手动这样做,那将是很好的。

ALTER TABLE authentication DROP CONSTRAINT  uk_authentication_01;
ALTER TABLE authentication ADD CONSTRAINT uk_authentication_01 UNIQUE (authenticator, method);

有没有办法用脚本进行批量修改?

2 个答案:

答案 0 :(得分:2)

您可以在shell脚本中迭代数据库:

for db in dbname1 dbname2 dbname3...
do
 psql -d $db -U username << EOF
ALTER TABLE authentication DROP CONSTRAINT  uk_authentication_01;
ALTER TABLE authentication ADD CONSTRAINT uk_authentication_01 UNIQUE (authenticator, method);
EOF
done

答案 1 :(得分:0)

我假设所有数据库都在同一台服务器上? 如果这是真的,你可以简单地做SELECT:

SELECT 'SELECT * FROM  dblink_exec(''dbname=' || datname 
         || '''::text, ''ALTER TABLE authentication 
         DROP CONSTRAINT  uk_authentication_01;
         ALTER TABLE authentication ADD CONSTRAINT uk_authentication_01 
         UNIQUE (authenticator, method);''::text);'
FROM pg_database WHERE datistemplate = false;

然后复制此查询的结果并运行它。

您需要该dblink扩展名:

CREATE EXTENSION dblink;