Re: Finding referecing and referenced tables, adaptation from David Fetter's solution

From: Gavin Flower <GavinFlower(at)archidevsys(dot)co(dot)nz>
To: Alban Hertroys <dalroi(at)solfertje(dot)student(dot)utwente(dot)nl>
Cc: bricklen <bricklen(at)gmail(dot)com>, pgsql-general(at)postgresql(dot)org
Subject: Re: Finding referecing and referenced tables, adaptation from David Fetter's solution
Date: 2011-07-31 10:53:21
Message-ID: 4E353421.5000903@archidevsys.co.nz
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 31/07/11 21:42, Alban Hertroys wrote:
> On 30 Jul 2011, at 12:17, Gavin Flower wrote:
>
>>> CREATE OR REPLACE VIEW table_dependencies AS (
>>> WITH RECURSIVE t AS (
>>> SELECT
>>> c.oid AS origin_id,
>>> c.oid::regclass::text AS origin_table,
>>> c.oid AS referencing_id,
>>> c.oid::regclass::text AS referencing_table,
>>> c2.oid AS referenced_id,
>>> c2.oid::regclass::text AS referenced_table,
>>> ARRAY[c.oid::regclass,c2.oid::regclass] AS chain
>>> FROM pg_catalog.pg_constraint AS co
>>> INNER JOIN pg_catalog.pg_class AS c
>>> ON c.oid = co.conrelid
>>> INNER JOIN pg_catalog.pg_class AS c2
>>> ON c2.oid = co.confrelid
>>> -- Add this line as "parameter" if you want to make a one-off query
>>> -- or a function instead of a view
>>> -- WHERE c.oid::regclass::text = '<table name>'
>>>
>>> UNION ALL
>>> SELECT
>>> t.origin_id,
>>> t.origin_table,
>>> t.referenced_id AS referencing_id,
>>> t.referenced_table AS referencing_table,
>>> c3.oid AS referenced_id,
>>> c3.oid::regclass::text AS referenced_table,
>>> t.chain || c3.oid::regclass AS chain
>>> FROM pg_catalog.pg_constraint AS co
>>> INNER JOIN pg_catalog.pg_class AS c3
>>> ON c3.oid = co.confrelid
>>> INNER JOIN t
>>> ON t.referenced_id = co.conrelid
>> I just realized that the 3rd& 4th line will always show the same values as the 1st& 2nd lines, as only the column headings change! Is this intentional?
>>
>> c.oid AS origin_id,
>> c.oid::regclass::text AS origin_table,
>> c.oid AS referencing_id,
>> c.oid::regclass::text AS referencing_table,
>
> Only the 'root'-nodes of the recursive tree are going through that part of the UNION. Those don't have an origin. It's a matter of choice what to do in that case. Common choices are to make root nodes reference themselves or to set their origins to NULL.
> Either case has cons and pros that usually depend on how the query results are used.
>
> Alban Hertroys
[...]
Thanks, I missed that...

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Chris Travers 2011-07-31 13:52:27 Re: eval function
Previous Message Gavin Flower 2011-07-31 10:42:18 Re: Finding referecing and referenced tables, adaptation from David Fetter's solution