Skip to content

Instantly share code, notes, and snippets.

@gullevek
Last active December 5, 2024 02:58
Show Gist options
  • Save gullevek/165ab6114da3ec56432229de5f75a0d5 to your computer and use it in GitHub Desktop.
Save gullevek/165ab6114da3ec56432229de5f75a0d5 to your computer and use it in GitHub Desktop.
Read all tables and columns that have some a/i attribute as index, serial, identity
CREATE OR REPLACE VIEW identity_column_status AS
WITH table_data AS (
SELECT
t.table_catalog, t.table_schema, t.table_name,
t.table_schema || '.' || t.table_name AS schema_table_name
FROM
information_schema.tables AS t
WHERE
t.table_type = 'BASE TABLE'
AND t.table_schema NOT IN ('information_schema', 'pg_catalog')
)
SELECT
t.table_catalog, t.table_schema, t.table_name, t.schema_table_name,
c.column_name, c.column_default, c.data_type,
tc_ccu.constraint_name, tc_ccu.constraint_type,
dep.deptype,
CASE
WHEN dep.deptype = 'a' AND c.column_default IS NULL THEN 'INDEX'
WHEN dep.deptype = 'a' AND c.column_default IS NOT NULL THEN 'SERIAL'
WHEN Dep.deptype = 'i' THEN 'IDENTITY'
ELSE 'UNKNOWN'
END::VARCHAR AS column_setting
FROM
table_data AS t,
information_schema.columns AS c
LEFT JOIN (
SELECT
ccu.table_catalog, ccu.table_schema, ccu.table_name, ccu.column_name,
ccu.constraint_catalog, ccu.constraint_schema, ccu.constraint_name,
tc.constraint_type
FROM
table_data AS t,
information_schema.table_constraints AS tc,
information_schema.constraint_column_usage ccu
WHERE
t.table_name = tc.table_name
AND tc.constraint_type <> 'FOREIGN KEY'
AND tc.constraint_catalog = ccu.constraint_catalog
AND tc.constraint_schema = ccu.constraint_schema
AND tc.constraint_name = ccu.constraint_name
) AS tc_ccu ON (
tc_ccu.table_catalog = c.table_catalog
AND tc_ccu.table_schema = c.table_schema
AND tc_ccu.table_name = c.table_name
AND tc_ccu.column_name = c.column_name
),
pg_depend AS dep
WHERE
t.table_catalog = c.table_catalog
AND t.table_schema = c.table_schema
AND t.table_name = c.table_name
AND dep.classid = 'pg_class'::regclass::oid AND dep.refobjid = (
SELECT oid FROM pg_class WHERE relnamespace = (
SELECT oid FROM pg_namespace WHERE nspname = t.table_schema
) AND relname = t.table_name
) AND dep.refobjsubid = (
SELECT attnum FROM pg_attribute WHERE attrelid = (
SELECT oid FROM pg_class WHERE relnamespace = (
SELECT oid FROM pg_namespace WHERE nspname = t.table_schema
) AND relname = t.table_name
) AND attname = c.column_name::name
)
AND dep.objsubid = 0
ORDER BY
t.table_catalog, t.table_schema, t.table_name, c.column_name
;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment