具有架构支持的postgresql副本

时间:2012-12-07 16:52:23

标签: postgresql multi-tenant

我正在尝试使用postgresql COPY命令从CSV加载一些数据。诀窍是我想在userid上实现多租户(包含在CSV中)。在加载csv时,是否有一种简单的方法可以告诉postgres copy命令根据此用户ID进行过滤?

即。 userid = x的所有行转到schema = x,userid = y的行转到schema = y。

1 个答案:

答案 0 :(得分:2)

没有办法只使用COPY命令执行此操作,但您可以将所有数据复制到主表中,然后将一个简单的PL / PGSQL函数放在一起,为您执行此操作。像这样的东西 -

CREATE OR REPLACE FUNCTION public.spike()
    RETURNS void AS
$BODY$
    DECLARE
        user_id integer;
        destination_schema text;
    BEGIN
        FOR user_id IN SELECT userid FROM master_table GROUP BY userid LOOP
            CASE user_id
            WHEN 1 THEN
                destination_schema := 'foo';
            WHEN 2 THEN
                destination_schema := 'bar';
            ELSE
                destination_schema := 'baz';
            END CASE;


            EXECUTE 'INSERT INTO '|| destination_schema ||'.my_table SELECT * FROM master_table WHERE userid=$1' USING user_id;
            -- EXECUTE 'DELETE FROM master_table WHERE userid=$1' USING user_id;

        END LOOP;

            TRUNCATE TABLE master_table;

        RETURN;
    END;
$BODY$
    LANGUAGE 'plpgsql' VOLATILE
    COST 100;

这将从master_table获取所有唯一的user_id,使用CASE语句确定目标模式,然后执行INSERT SELECT以移动行,最后删除移动的行。