Advertisement
Guest User

Untitled

a guest
Jun 25th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.60 KB | None | 0 0
  1. CREATE OR REPLACE FUNCTION public.has_cascade_foreign_key(tabela character varying, valor_pk bigint)
  2. RETURNS integer
  3. LANGUAGE plpgsql
  4. AS $function$
  5. DECLARE
  6. sql TEXT;
  7. tbl_com_fk VARCHAR;
  8. col_com_fk VARCHAR;
  9. qtde INTEGER;
  10. retorno INTEGER;
  11. var_schema VARCHAR = '';
  12. var_tabela VARCHAR = '';
  13. rs RECORD;
  14. BEGIN
  15. retorno = 0;
  16.  
  17. SELECT
  18. split_part(tabela,'.',1) AS nome_schema,
  19. split_part(tabela,'.',2) AS nome_tabela
  20. INTO var_schema,var_tabela;
  21.  
  22. IF (var_tabela IS NULL OR var_tabela = '' ) THEN
  23. var_tabela = var_schema;
  24. var_schema = 'public';
  25. END IF;
  26.  
  27. FOR rs IN
  28.  
  29. SELECT
  30. (nf.nspname || '.' || clf.relname) AS tabela_principal,
  31. (af.attname) AS coluna_principal,
  32. (ct.conname) AS chave,
  33. (n.nspname || '.' || cl.relname) AS tabela_com_fk,
  34. (a.attname) AS coluna_com_fk
  35. FROM pg_catalog.pg_attribute a
  36.  
  37. INNER JOIN pg_catalog.pg_class cl
  38. ON a.attrelid = cl.oid and cl.relkind = 'r'
  39.  
  40. INNER JOIN pg_catalog.pg_namespace n
  41. ON n.oid = cl.relnamespace
  42.  
  43. INNER JOIN pg_catalog.pg_constraint ct
  44. ON a.attrelid = ct.conrelid
  45. AND ct.confrelid <> 0
  46. AND ct.conkey[1] = a.attnum
  47.  
  48. INNER JOIN pg_catalog.pg_class clf
  49. ON ct.confrelid = clf.oid
  50. AND clf.relkind = 'r'
  51.  
  52. INNER JOIN pg_catalog.pg_namespace nf
  53. ON nf.oid = clf.relnamespace
  54.  
  55. INNER JOIN pg_catalog.pg_attribute af
  56. ON af.attrelid = ct.confrelid
  57. AND af.attnum = ct.confkey[1]
  58.  
  59. WHERE 1=1
  60. AND nf.nspname = var_schema
  61. AND (pg_get_constraintdef(ct.oid) LIKE '%ON DELETE CASCADE%')
  62. AND (UPPER(clf.relname) like UPPER(var_tabela))
  63. ORDER BY n.nspname,cl.relname,clf.relname
  64.  
  65. LOOP
  66.  
  67. tbl_com_fk = rs.tabela_com_fk;
  68. col_com_fk = rs.coluna_com_fk;
  69.  
  70. IF (tbl_com_fk <> '') THEN
  71. sql := 'SELECT COUNT(*) FROM ' || tbl_com_fk || ' WHERE ' || col_com_fk || ' = ' || valor_pk;
  72. EXECUTE sql INTO qtde;
  73. END IF;
  74.  
  75. IF (qtde > 0) THEN
  76. RETURN 1;
  77. END IF;
  78.  
  79. END LOOP;
  80.  
  81. RETURN retorno;
  82.  
  83. END;
  84. $function$
  85. ;
  86. ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement