在不同的模式下运行相同的脚本 - postgres

时间:2016-10-19 11:37:22

标签: database postgresql psql postgresql-9.5

我有一个名为populate.sql的脚本,其中包含创建表。

CREATE TABLE "EXAMPLE" (
.................
..............
);
CREATE TABLE "BlaBla" (
..........
........
);
CREATE TABLE ...

此脚本创建超过20个表。我想在不同的模式之上运行此populate.sql。我们想说我想在schema1schema2schema3上运行此脚本。

然后我可以写;

CREATE SCHEMA IF NOT EXISTS "schema1";
SET SCHEMA 'schema1';
populate.sql

并在一个架构上创建这些表。

如何在一个psql命令中的所有模式上创建这些表?

据我觉得我必须在psql上做FOR LOOP并首先创建模式并在该方案之上创建表。

1 个答案:

答案 0 :(得分:1)

将在当前设置的search_path中创建表(如果没有在create语句中特别设置)。

你可以使用一个循环。在该循环中,您必须将搜索路径设置为模式。

DO 
$$
  DECLARE schemaname text;
BEGIN
    FOR i IN 1..3 LOOP

    schemaname := 'schema' || i::text;

    execute 'CREATE SCHEMA ' || schemaname;
    execute 'SET SCHEMA ' || schemaname;    
    execute 'SET search_path TO ' || schemaname;

    -- conent of populate.sql

  END LOOP;
END
$$;

您无法在评论中a_horse_with_no_name提及此do block内的外部脚本。因此,只有当您想要扩展populate.sql文件并将其do block包裹起来时,此答案才有意义。