È 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()?
pg_cancel_backend |
pg_terminate_backend |
|
|---|---|---|
| Cosa fa | Annulla la query in corso | Chiude la connessione |
| La sessione rimane aperta? | ✅ Sì | ❌ No |
| Segnale inviato | SIGINT |
SIGTERM |
| Meno invasivo? | ✅ Sì | ❌ No |
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
truese il segnale è stato inviato con successo,falsese il processo non esiste o non è cancellabile. - Il
pg_cancel_backendnon è immediato: PostgreSQL invia il segnale e il processo lo gestisce al primo punto sicuro, evitando di lasciare i dati in uno stato inconsistente.