0

適度な PostgreSQL のインストールで、かなりの数のストアド プロシージャ/関数と型が蓄積されました。

現在、最下位レベルの複合型 (つまり、3 つの型が構築されており、無数の関数がそれらの型のいずれかを参照している) では、型の 1 つの要素が間違った型(つまり、bigint ではなく smallint) であるため、その処理は同一であり、範囲が異なります。

  1. タイプに応じてすべてのタイプを知るにはどうすればよいですか (pg_catalog.pg_type が不十分なようです)。
  2. タイプに応じてすべての関数を知るにはどうすればよいですか (引数およびローカル スコープの変数として)。
  3. 複合型に依存するすべての単一関数を削除/再構築せずに、複合型をリファクタリングできますか (おそらく smallint を bigint に変更します)。
  4. そのようなリファクタリングのための自動化/ツール/ベストプラクティスはありますか?

私はその4つの質問を1つに知っていますが、これはちょっとイライラするので、助けていただければ幸いです! どうもありがとう!

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 に答える