È una funzione PostgreSQL che annulla la query attiva senza interrompere la connessione stessa. Accetta come parametro il PID, ovvero l'ID del processo attivo.

Cosa fa questa funzione?

La funzione invia un segnale di interruzione (SIGINT) al processo e lascia la sessione aperta, permettendo all'utente di inviare nuovi comandi.

⚠️ Usa il codice con cautela

SELECT pg_cancel_backend(1234)

Qual è la differenza con pg_terminate_backend()?

Preferisci sempre pg_cancel_backend quando vuoi interrompere solo la query senza disconnettere l'utente. Usa pg_terminate_backend solo se la sessione è bloccata e non risponde al cancel.

Caso d'uso con pg_stat_activity

Nella pratica il PID si ricava dalla vista pg_stat_activity. Questo esempio annulla tutte le query attive da più di 5 minuti:

⚠️ Usa il codice con cautela

SELECT pg_cancel_backend(pid)
FROM pg_stat_activity
WHERE state = 'active'
  AND now() - query_start > interval '5 minutes';

Note

Richiede il ruolo pg_signal_backend (o superuser) per agire su sessioni altrui.

-- mostra se l'utente corrente ha il ruolo `pg_signal_backend`
SELECT
rolsuper AS is_superuser,
pg_has_role(CURRENT_USER, 'pg_signal_backend', 'MEMBER') AS has_pg_signal_backend
FROM pg_roles
WHERE rolname = CURRENT_USER;
  • La funzione restituisce true se il segnale è stato inviato con successo, false se il processo non esiste o non è cancellabile.
  • Il pg_cancel_backend non è immediato: PostgreSQL invia il segnale e il processo lo gestisce al primo punto sicuro, evitando di lasciare i dati in uno stato inconsistente.