0

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

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

  1. 我如何知道取决于类型的所有类型(pg_catalog.pg_type 似乎不够)?
  2. 我如何知道取决于类型的所有函数(作为参数和本地范围的变量)?
  3. 我可以重构一个复合类型(可能将 smallint 更改为 bigint)而不依赖它删除/重建每个函数吗?
  4. 这种重构是否有任何类型的自动化/工具/最佳实践?

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

4

1 回答 1

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).

于 2009-05-11T21:13:01.113 回答