如何从PL/pgSQL提取表名列名及类型 咨询GP迁移适配工具
PL/pgSQL场景下的函数元数据提取方案
针对GP迁移场景下从PL/pgSQL脚本提取表名、列名、对应数据类型的需求,不需要依赖额外的托管工具,用两类方案就能覆盖全部场景:
- 已入库的函数对象:直接查询系统目录提取,准确率100%
只要函数已经加载到Greenplum/PostgreSQL实例中,直接通过系统依赖表查询就能拿到所有关联的元数据,不会漏掉隐式依赖,也不会被动态SQL、别名写法干扰。-- 批量提取指定Schema下所有函数关联的表、字段、字段类型 SELECT p.proname AS 函数名, n.nspname AS 表所属Schema, c.relname AS 表名, a.attname AS 列名, pg_catalog.format_type(a.atttypid, a.atttypmod) AS 列数据类型 FROM pg_proc p JOIN pg_namespace pn ON p.pronamespace = pn.oid JOIN pg_depend d ON p.oid = d.objid JOIN pg_class c ON d.refobjid = c.oid JOIN pg_namespace n ON c.relnamespace = n.oid JOIN pg_attribute a ON d.refobjid = a.attrelid AND d.refobjsubid = a.attnum WHERE c.relkind IN ('r','v','m') -- 匹配普通表、视图、物化视图 AND a.attnum > 0 AND NOT a.attisdropped AND pn.nspname = '替换为你存放函数的目标Schema名'; - 离线脚本批量解析:用正则规则匹配即可满足绝大多数常规场景
如果你手头只有未入库的.sql函数脚本,可以写简单的批量解析脚本按以下规则提取:- 表名匹配:捕获
FROM、JOIN、UPDATE、INSERT INTO、INTO关键字后紧跟的标识符,过滤掉CTE别名、临时表名即可 - 列与类型匹配:优先捕获
表名.列名格式的显式引用,再匹配CREATE TABLE、DECLARE块内的列名/变量名 类型定义,同时识别%TYPE、%ROWTYPE这类PL/pgSQL特有类型写法,映射到对应实体字段的类型
- 注意:如果脚本里有大量动态拼接SQL的
EXECUTE写法,正则解析会存在遗漏,这类脚本建议先加载到无业务数据的测试GP实例中,再用上面的系统目录查询方式补全元数据,避免迁移时漏字段。
- 表名匹配:捕获
提取完成后建议做一轮去重校验,过滤掉函数内定义的变量、别名和实体字段的重名冲突,提取出的清单可以直接用来做迁移前后的表结构、字段类型对齐,不用逐行人工翻查脚本。
内容的提问来源于stack exchange,提问作者Laszlo Winter
相关产品推荐
相关产品推荐

