2009-05-11 7 views
0

適度なPostgreSQLのインストールでは、かなりのストアドプロシージャ/関数とタイプが蓄積されました。PostgreSQL SProcsをリファクタリングする

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

  1. どのように私は(pg_catalog.pg_typeが 不十分と思われる) タイプに応じて、すべてのタイプを知っていますか?
  2. の機能はタイプによって異なります( 引数とローカルスコープのvars)。
  3. 複合タイプ (おそらくsmallintからbigintに変更することができます) 個々の機能ごとに削除する/再構築することなくすべて削除できますか?
  4. このようなリファクタリングには、どのような種類のオートメーション/ツール/ベストプラクティスがありますか?

私はその4つの質問を1つで知っていますが、atmこれは一種の欲求不満です。 多くのありがとう!

答えて

1

システムカタログ "pg_depend"には、有用な依存関係情報が含まれています。あなたは少し、このような特定の種類に応じて、オブジェクトを見つけることができます。これは、「information_schema.sql_identifier」タイプに依存するオブジェクトを見つけ

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

。その結果、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)によって記述されたオブジェクトに依存して、いくつかのオブジェクトについて説明します、この場合のように、あなたは、このような結果をフォーマットすることができます。

+0

これは素晴らしいですが、タイプ階層そのものを教えてくれるのですよね?これは従属関数に拡張されませんか? – Martin

+0

どの関数がどのユーザタイプ(refclassid = 'pg_proc' :: regclass)に依存するのかを知ることができますが、どの関数が他のどの関数を呼び出すのかは分かりません。あなたがローカル変数としてユーザー型を使用しているかどうかを調べるための関数の実装に入ることはないと思われます。私は、この情報がPostgreSQLの言語に依存しない部分によって管理されていると考えています。 – araqnid

+0

plpsqlコードベースのリファクタリングが遭遇する問題でなければならないので、もっと知ることができるかどうか試してみてください。そこにはいくつかのソリューションやツールのサポートが必要です。 – Martin