2016-01-29 2 views
2

Existe-t-il un moyen d'obtenir une liste de tables qui serait également tronquée par un TRUNCATE CASCADE dans postgres?Obtenir la liste des tables qui seraient tronquées par une cascade

Ainsi, par exemple, en supposant que nous avons trois tables:

a 
b (depends on a) 
c (depends on b) 

TRUNCATE a CASCADE; tronquait aussi b et c. Comment pourrions-nous vérifier cela à l'avance?

+2

Essayez [ce] (http://hastebin.com/dohoviyamo.sql) –

+0

fonctionne comme un charme! Je voudrais simplement ajouter pour ceux qui cherchent que vous pouvez ajouter 'AND ccu.table_name = 'a'' pour satisfaire la question. –

+0

Oui, vous le pouvez certainement. –

Répondre

1

Avec l'aide de this réponse que vous pouvez obtenir le nom de la table étrangère par cette requête

SELECT tc.constraint_name 
     ,tc.table_name 
     ,kcu.column_name 
     ,ccu.table_name AS foreign_table_name 
     ,ccu.column_name AS foreign_column_name 
FROM 
    information_schema.table_constraints AS tc 
    JOIN information_schema.key_column_usage AS kcu 
     ON tc.constraint_name = kcu.constraint_name 
    JOIN information_schema.constraint_column_usage AS ccu 
     ON ccu.constraint_name = tc.constraint_name 
WHERE constraint_type = 'FOREIGN KEY' AND ccu.table_name = 'a' 

OU

Créer une vue avec une autre requête

CREATE VIEW vdepend_table 
AS 
SELECT s1.constraint_name 
    ,s1.table_name 
    ,s1.column_name 
    ,s1.ordinal_position 
    ,s2.table_name_ref 
    ,s2.column_name_ref 
    ,s2.ordinal_position_ref 
FROM (
    SELECT key_column_usage.constraint_name 
     ,key_column_usage.table_name 
     ,key_column_usage.column_name 
     ,columns.ordinal_position 
    FROM information_schema.key_column_usage 
    JOIN information_schema.columns USING (
      table_name 
      ,column_name 
      ) 
    ) s1 
JOIN (
    SELECT constraint_column_usage.constraint_name 
     ,constraint_column_usage.table_name AS table_name_ref 
     ,constraint_column_usage.column_name AS column_name_ref 
     ,cols_ref.ordinal_position AS ordinal_position_ref 
    FROM information_schema.constraint_column_usage 
    JOIN information_schema.columns cols_ref ON cols_ref.table_name::TEXT = constraint_column_usage.table_name::TEXT 
     AND cols_ref.column_name::TEXT = constraint_column_usage.column_name::TEXT 
    ) s2 ON s1.constraint_name::TEXT = s2.constraint_name::TEXT 
    AND NOT s1.table_name::TEXT = s2.table_name_ref::TEXT; 

utilisation:

select table_name from vdepend_table where table_name_ref='a'