39 lines
1.1 KiB
Bash
39 lines
1.1 KiB
Bash
#!/bin/bash
|
|
set -e
|
|
|
|
echo "== Fixing sequences across all databases =="
|
|
|
|
for db in $(psql -Atqc "SELECT datname FROM pg_database WHERE datallowconn AND datname NOT IN ('template1')"); do
|
|
echo "---- DB: $db ----"
|
|
|
|
# Generate fix statements
|
|
SQL=$(psql -d "$db" -Atqc "
|
|
SELECT
|
|
'SELECT setval(' ||
|
|
quote_literal(pg_get_serial_sequence(quote_ident(n.nspname)||'.'||quote_ident(c.relname), a.attname)) ||
|
|
', COALESCE(MAX(' || quote_ident(a.attname) || '), 0) + 1, false) FROM ' ||
|
|
quote_ident(n.nspname)||'.'||quote_ident(c.relname) || ';'
|
|
FROM pg_class c
|
|
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
JOIN pg_attribute a ON a.attrelid = c.oid
|
|
WHERE c.relkind = 'r'
|
|
AND a.attnum > 0
|
|
AND NOT a.attisdropped
|
|
AND pg_get_serial_sequence(quote_ident(n.nspname)||'.'||quote_ident(c.relname), a.attname) IS NOT NULL;
|
|
")
|
|
|
|
if [ -z "$SQL" ]; then
|
|
echo "No sequences found in $db"
|
|
continue
|
|
fi
|
|
|
|
echo "Fixing sequences in $db..."
|
|
|
|
# Execute generated statements
|
|
echo "$SQL" | psql -d "$db"
|
|
|
|
done
|
|
|
|
echo "== Done fixing sequences =="
|
|
|