重构PostgreSQL SProcs

时间:2009-05-11 19:32:32

标签: postgresql refactoring user-defined-functions

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

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

  1. 我如何根据所有类型了解 一个类型(pg_catalog.pg_type似乎 不足)?
  2. 我怎么知道所有 功能取决于类型(如 参数和本地范围的变量)?
  3. 我可以重构一个复合类型吗? (也许将smallint改为bigint) 没有丢弃/重建每一个 单一功能取决于它?
  4. 有什么样的 自动化/工具/最佳实践 这样的重构?
  5. 我知道它的4个问题,但是atm这有点令人沮丧,任何帮助都会受到赞赏! 非常感谢!

1 个答案:

答案 0 :(得分: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)描述的对象的对象。