Skip to content

Instantly share code, notes, and snippets.

@0xBigBoss
Created January 11, 2025 20:56
Show Gist options
  • Save 0xBigBoss/b805f473454d38ffa9012184b65d36b8 to your computer and use it in GitHub Desktop.
Save 0xBigBoss/b805f473454d38ffa9012184b65d36b8 to your computer and use it in GitHub Desktop.
-- Find indexes on the table
SELECT indexname, tablename
FROM pg_indexes
WHERE tablename = '' || ${table_name} || '';
-- Find foreign key relationships
SELECT
tc.table_schema,
tc.constraint_name,
tc.table_name,
kcu.column_name,
ccu.table_schema AS foreign_table_schema,
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
AND tc.table_schema = kcu.table_schema
JOIN information_schema.constraint_column_usage AS ccu
ON ccu.constraint_name = tc.constraint_name
AND ccu.table_schema = tc.table_schema
WHERE tc.constraint_type = 'FOREIGN KEY'
AND (tc.table_name = '' || ${table_name} || '' -- Tables referencing your table
OR ccu.table_name = '' || ${table_name} || ''); -- Tables referenced by your table
-- Find functions using the table
SELECT DISTINCT
p.proname AS function_name,
n.nspname AS schema_name
FROM
pg_proc p
JOIN pg_namespace n ON p.pronamespace = n.oid
JOIN pg_depend d ON d.objid = p.oid
JOIN pg_class c ON d.refobjid = c.oid
WHERE
c.relname = '' || ${table_name} || '';
SELECT n.nspname AS schema_name,
p.proname AS function_name,
CASE p.prokind
WHEN 'f' THEN 'function'
WHEN 'p' THEN 'procedure'
WHEN 'a' THEN 'aggregate'
WHEN 'w' THEN 'window'
END AS type,
p.prosrc AS function_source
FROM pg_proc p
JOIN pg_namespace n ON p.pronamespace = n.oid
WHERE p.prosrc LIKE '%' || ${table_name} || '%'
AND n.nspname NOT IN ('pg_catalog', 'information_schema');
-- Find triggers on the table
SELECT
trigger_name,
event_manipulation,
event_object_schema,
event_object_table,
action_statement,
action_timing
FROM
information_schema.triggers
WHERE
event_object_table = '' || ${table_name} || '';
-- Find views referencing the table
SELECT DISTINCT
views.table_name AS view_name,
views.table_schema AS schema_name
FROM
information_schema.views,
information_schema.tables
WHERE
views.view_definition LIKE '%' || ${table_name} || '%';
-- Show all dependencies
SELECT DISTINCT dependent_ns.nspname as dependent_schema,
dependent_view.relname as dependent_view,
source_ns.nspname as source_schema,
source_table.relname as source_table
FROM pg_depend
JOIN pg_rewrite ON pg_depend.objid = pg_rewrite.oid
JOIN pg_class as dependent_view ON pg_rewrite.ev_class = dependent_view.oid
JOIN pg_class as source_table ON pg_depend.refobjid = source_table.oid
JOIN pg_namespace dependent_ns ON dependent_view.relnamespace = dependent_ns.oid
JOIN pg_namespace source_ns ON source_table.relnamespace = source_ns.oid
WHERE source_table.relname = '' || ${table_name} || '';
-- Find sequences
SELECT
t.schemaname,
t.tablename,
pg_get_serial_sequence(t.schemaname || '.' || t.tablename, c.column_name) as sequence_name,
c.column_name
FROM pg_tables t
JOIN information_schema.columns c
ON t.tablename = c.table_name
AND t.schemaname = c.table_schema
WHERE pg_get_serial_sequence(t.schemaname || '.' || t.tablename, c.column_name) IS NOT NULL
AND t.tablename = '' || ${table_name} || '';
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment