【问题标题】:alter table in multiple database postgres在多个数据库 postgres 中更改表
【发布时间】:2013-01-25 09:33:14
【问题描述】:

我有多个数据库,每个都有表“身份验证”。在每个表中,我想删除一个约束并将其替换为一个新约束。如果我不必手动执行此操作,那就太好了。

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

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

【问题讨论】:

标签: database postgresql shell alter-table


【解决方案1】:

您可以在 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

【讨论】:

    【解决方案2】:

    我假设所有数据库都在同一台服务器上? 如果这是真的,您可以简单地执行 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;
    

    【讨论】:

    • 是的,它们在同一个 servlet 上。让我试试看,如果可行,我会回来接受正确答案。
    • 遗憾的是,它似乎不起作用。我们可以坚持最基本的要领吗?假设我只想删除第一个约束,并且只想在两个数据库 baml1 和 baml2 上执行它。它们在同一台服务器上。
    • 你先安装扩展了吗?
    • 当你只运行 - SELECT datname FROM pg_database WHERE datistemplate = false;你得到 dbs 的列表了吗?
    • 创建扩展数据库链接;错误:无法打开扩展控制文件“/usr/pkg/share/postgresql/extension/dblink.control”:没有这样的文件或目录
    猜你喜欢
    • 2020-06-13
    • 1970-01-01
    • 2014-05-13
    • 2020-12-29
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    相关资源
    最近更新 更多