重构 PostgreSQL SProcs

Posted

技术标签:

【中文标题】重构 PostgreSQL SProcs【英文标题】:Refactoring PostgreSQL SProcs 【发布时间】:2009-05-11 19:32:32 【问题描述】:

通过适度的 PostgreSQL 安装,我们积累了相当多的存储过程/函数和类型。

现在在最低级别的复合类型中(即用它构建了 3 种类型,并且无数函数引用其中任何一种类型)该类型的一个元素是 错误类型(即 smallint 而不是 bigint ),因此处理是相同的,只是范围不同。

    我如何知道所有类型取决于 一种类型(pg_catalog.pg_type 似乎 不足)? 我怎样才能知道所有 取决于类型的功能(如 参数和局部范围的变量)? 我可以重构复合类型吗 (也许将 smallint 更改为 bigint) 无需丢弃/重建每个 单功能靠它? 有没有一种 自动化/工具/最佳实践 这样的重构?

我知道它的 4 个问题合而为一,但是 atm 这有点令人沮丧,我们将不胜感激! 非常感谢!

【问题讨论】:

【参考方案1】:

系统目录“pg_depend”包含一些有用的依赖信息。您可以像这样根据特定类型查找对象:

select * from pg_depend where refclassid = 'pg_type'::regclass
    and refobjid = 'information_schema.sql_identifier'::regtype;

这会查找依赖于“information_schema.sql_identifier”类型的对象。结果,classid 是目录的 OID——例如,对于取决于用户类型的列,classid 是 'pg_class'::regclass,objid 是 pg_class 行的 OID,objsubid 是来自 pg_attribute 的 attnum 值,因此对于这种情况,您可以像这样格式化结果:

select objid::regclass, attname from pg_depend
    join pg_attribute on pg_attribute.attrelid = pg_depend.objid and pg_attribute.attnum = pg_depend.objsubid
where refclassid = 'pg_type'::regclass and refobjid = 'information_schema.sql_identifier'::regtype
    and classid = 'pg_class'::regclass
limit 10

所以在 pg_depend 中,(classid,objid,objsubid) 描述了一些依赖于(refclassid,refobjid) 描述的对象的对象。

【讨论】:

这很棒,但它只给了我类型层次本身,对吧?这不扩展到依赖函数? 它会告诉你哪些函数取决于哪些用户类型(refclassid = 'pg_proc'::regclass),但不会告诉你哪些函数调用了哪些其他函数,不。我怀疑它也不会深入到函数的实现中来查看您是否将用户类型用作局部变量;我怀疑这些信息都是由 PostgreSQL 的与语言无关的部分管理的,它不会看到。 我明白了,我想看看我是否能找到更多,因为重构 plpsql 代码库应该是一个遇到的问题,并且应该有一些解决方案或工具支持。跨度> 很难找到任何关于防止drop cascades和获取有关cascades的可靠信息,这些信息保存在pg_depend中,如上所示,似乎也几乎没有工具支持,所以让我们关闭它现在

以上是关于重构 PostgreSQL SProcs的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy ORM 重构器的替代方案

Liquibase 了解

重构map重构filter重构Some重构reduce方法重构flat函数

MySQL 8.0 Server层最新架构详解

《重构》学习常用的重构手法 下

C#重构学习2