当前位置: 首页 > 面试题库 >

重复的Postgresql模式,包括序列

司马萧迟
2023-03-14
问题内容

我的数据库布局需要为每个新客户创建新的架构。目前,我使用在网上找到的内部函数,并对其进行了一些修改。

CREATE FUNCTION copy_schema(
    source_schema character varying, 
    target_schema character varying, 
    copy_data boolean)
RETURNS integer AS
$BODY$
DECLARE
    t_ex integer := 0;
    s_ex integer := 0;
    src_table character varying;
    trg_table character varying;
BEGIN
    if (select 1 from pg_namespace where nspname = source_schema) THEN
        -- we have defined target schema
        s_ex := 1;
    END IF;

    IF (s_ex = 0) THEN
        -- no source schema exist
        RETURN 0;
    END IF;

    if (select 1 from pg_namespace where nspname = target_schema) THEN
        -- we have defined target schema need to sync all table layout
        t_ex := 1;
    ELSE
        EXECUTE 'CREATE SCHEMA '||target_schema||' AUTHORIZATION user';
    END IF;

    FOR src_table IN 
       SELECT table_name 
       FROM information_schema.TABLES 
       WHERE table_schema = source_schema
    LOOP
        trg_table := target_schema||'.'||src_table;
        EXECUTE 
            'CREATE TABLE ' || trg_table || ' (LIKE ' || source_schema || '.' || src_table || ' INCLUDING ALL)';
        IF (copy_data = true) THEN
            EXECUTE 'INSERT INTO ' || trg_table || '(SELECT * FROM ' || source_schema || '.' || src_table || ')';
        END IF;
    END LOOP;

    return t_ex;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

该脚本的问题在于新架构中的表继续使用源架构的序列。有没有办法使用sql语句(或其他可靠的方法)为新创建的表获取序列的新副本(甚至是复制整个架构的另一种可靠的方法)?


问题答案:

因此,经过一番思考后,我继续了更新我的第一篇文章中提到的sql函数,因此现在看起来像这样:

CREATE FUNCTION copy_schema(
    source_schema character varying, 
    target_schema character varying, 
    copy_data boolean)
RETURNS integer AS
$BODY$
DECLARE
    t_ex integer := 0;
    s_ex integer := 0;
    src_table character varying;
    trg_table character varying;
BEGIN
    if (select 1 from pg_namespace where nspname = source_schema) THEN
        -- we have defined target schema
        s_ex := 1;
    END IF;

    IF (s_ex = 0) THEN
        -- no source schema exist
        RETURN 0;
    END IF;

    if (select 1 from pg_namespace where nspname = target_schema) THEN
        -- we have defined target schema need to sync all table layout
        t_ex := 1;
    ELSE
        EXECUTE 'CREATE SCHEMA '||target_schema||' AUTHORIZATION user';
    END IF;

    FOR src_table IN 
        SELECT table_name 
        FROM information_schema.TABLES 
        WHERE table_schema = source_schema
    LOOP
        trg_table := target_schema||'.'||src_table;
        EXECUTE 'CREATE TABLE ' || trg_table || ' (LIKE ' || source_schema || '.' || src_table || ' INCLUDING ALL)';
        EXECUTE 'CREATE SEQUENCE ' || trg_table || '_id_seq OWNED BY '||trg_table || '.id';
        EXECUTE 'ALTER TABLE ' || trg_table || ' ALTER COLUMN id SET DEFAULT nextval('''|| trg_table || '_id_seq''::regclass)';
        IF (copy_data = true) THEN
            EXECUTE 'INSERT INTO ' || trg_table || '(SELECT * FROM ' || source_schema || '.' || src_table || ')';
        END IF;
    END LOOP;
    return t_ex;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

对于所有人来说,这不是一个通用的解决方案,但是由于我架构中的所有表都有名为id的串行字段,因此它很适合我。

@ erwin-brandstetter建议的版本带有转储/ hack转储文件/恢复还原转储文件的方式通常被视为论坛上的解决之道。

在专用服务器的情况下,它可以工作,在共享主机的情况下(或需要更少的外部脚本依赖性),内部功能的方式似乎更好。



 类似资料:
  • 我对两种类型的备份技术感兴趣: a)模式备份,它恢复数据库模式(添加或删除列、改变列类型、添加表等) b)数据备份,用于恢复数据(更新,从一个表读取到另一个表)。 我来举例说明一下: 首先,我创建实体“客户” ...而不是预期的... 如何获取预期的第一张快照? 更新1 相关问题: 在cassandra中导入和导出架构 如何恢复Cassandra快照

  • PostgreSQL 模式(SCHEMA)可以看着是一个表的集合。 一个模式可以包含视图、索引、数据类型、函数和操作符等。 相同的对象名称可以被用于不同的模式中而不会出现冲突,例如 schema1 和 myschema 都可以包含名为 mytable 的表。 使用模式的优势: 允许多个用户使用一个数据库并且不会互相干扰。 将数据库对象组织成逻辑组以便更容易管理。 第三方应用的对象可以放在独立的模式

  • 问题内容: 尝试在PostgreSQL上重新创建我的SQL Server数据库。一切正常,除了我找不到如何重新创建此索引: 将非常感谢您的帮助。 阿列克谢 更新: http://img38.imageshack.us/img38/1071/89013974.png这是db结构star + eav ,只有一个查询 也许这不是最佳的atm。我也正在努力。也许是这样的 任何提示欢迎=) 问题答案: 不支

  • 这里的结果是错误的,我不确定为什么。请帮忙

  • 我想安装“stabe-baselines3[额外]”,但在PyCharm包中,安装程序只提供“stable-baselines3”。 当尝试通过“pip install”安装时,我确实会遇到以下错误: 我如何获得[额外的]?