如何在一次操作中更改多个 PostgreSQL 表的架构?
Posted
技术标签:
【中文标题】如何在一次操作中更改多个 PostgreSQL 表的架构?【英文标题】:How to change schema of multiple PostgreSQL tables in one operation? 【发布时间】:2012-04-30 10:02:05 【问题描述】:我有一个 PostgreSQL 9.1 数据库,其中包含 100 个左右的表,这些表已加载到“公共”模式中。我想将这些表(但不是“公共”中的所有函数)移动到“数据”模式。
我知道我可以使用以下内容一次移动 1 张桌子。
ALTER TABLE [tablename] SET SCHEMA [new_schema]
是否可以在一次操作中将所有表移动到新架构?如果是这样,完成这项任务的最有效方法是什么?
【问题讨论】:
【参考方案1】:DO 可以解决问题:
DO
$$
DECLARE
row record;
BEGIN
FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = 'public' -- and other conditions, if needed
LOOP
EXECUTE 'ALTER TABLE public.' || quote_ident(row.tablename) || ' SET SCHEMA [new_schema];';
END LOOP;
END;
$$;
【讨论】:
听起来和我想象的一模一样。由于我是 postgres 的新手,我应该在哪里运行它?我在 pgAdmin 3 (windows) 和 psql 命令行中进行了尝试,但在这两种情况下都出现了错误。感谢您的帮助! 它只是一段 SQL,就像在您最喜欢的 SQL 客户端中的任何查询一样运行它。你可以使用 psql、pgAdmin3 或类似的东西。 我从 pgAdmin3 得到的错误是:“错误:类型“quote_ident”不存在。SQL 状态:42704。上下文:PL/pgSQL 函数“inline_code_block”在 EXECUTE 语句的第 5 行。”跨度> 你也可以移动你的函数:DO$$ DECLARE row record; sql text = E'\n'; BEGIN FOR row IN select proname::text as proname, pg_get_function_identity_arguments(p.oid) AS params from pg_proc p JOIN pg_type t on p.prorettype = t.oid JOIN pg_namespace n on n.oid = p.pronamespace LEFT JOIN pg_description d on p.oid = d.objoid WHERE nspname = 'public' LOOP sql = CONCAT(sql, E'\n', 'ALTER FUNCTION public.', row.proname, '(', row.params, ') SET schema [new_schema];'); END LOOP; EXECUTE sql; END;$$;
你可能也想要这些序列:DO $$ DECLARE row record; BEGIN FOR row IN SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = 'public' LOOP EXECUTE 'ALTER SEQUENCE public。' || quote_ident(row.sequence_name) || ' SET SCHEMA [new_schema];';结束循环;结尾; $$;以上是关于如何在一次操作中更改多个 PostgreSQL 表的架构?的主要内容,如果未能解决你的问题,请参考以下文章