因此,经过一番思考后,我继续了更新我的第一篇文章中提到的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 VOLATILECOST 100;对于所有人来说,这不是一个通用的解决方案,但是由于我架构中的所有表都有名为id的串行字段,因此它很适合我。
@ erwin-brandstetter建议的版本带有转储/ hack转储文件/恢复还原转储文件的方式通常被视为论坛上的解决之道。
在专用服务器的情况下,它可以工作,在共享主机的情况下(或需要更少的外部脚本依赖性),内部功能的方式似乎更好。



