Sì, è sempre male rendere dipendente il comportamento pg_trigger_depth()
Forse sono un po 'meno contrario alle affermazioni generali, ma a che serve? Non vi è alcun argomento che posso vedere sul motivo per cui si vorrebbe una tale funzione. Lo scopo principale di un database è garantire l'integrità dei dati. E per quanto posso vedere, e potrei sbagliarmi, un tale uso è sempre una potenziale violazione dell'integrità dei dati. Nella risposta di @ Erwin dice "se dimentichi" . Il punto di garantire l'integrità è eliminare questa possibilità. Se un agente riesce a ricordare tutto e a comprendere le conseguenze e il codice che lo circonda, puoi ottenere l'integrità dei dati da qualsiasi cosa .
Introduciamo alcuni termini, nella programmazione, abbiamo
- "stato" che include tutto ciò a cui un programmatore ha accesso.
- "contesto di esecuzione" che include l'ambiente per l'esecuzione.
Abbiamo inoltre un termine per una funzione, che non ha uno stato che chiamiamo funzione pura ,
La funzione valuta sempre lo stesso valore di risultato dati gli stessi valori di argomento. Il valore del risultato della funzione non può dipendere da alcuna informazione o stato nascosto che può cambiare mentre procede l'esecuzione del programma o tra diverse esecuzioni del programma, né può dipendere da alcun input esterno dai dispositivi I / O (di solito, vedere di seguito).
La distinzione per purezza è utile perché elimina qualsiasi onere di ricordare qualcosa per conto del computer o del programmatore: f(x) = y
è sempre vero. Qui stai violando la purezza nel punto peggiore: il database. E lo stai facendo in modo complesso e soggetto a errori - rendendo il contesto di esecuzione interno una cosa palpabile nello stato della tua applicazione DB.
Non lo vorrei. Considera solo le complessità che devi tamponare mentalmente.
Table A
's Trigger A
incendi
Trigger A
rilascia sempre DML a Table B
, sparando Trigger B
.
Trigger B
rilascia condizionalmente DML a Table A
, sparando Trigger A
.
Trigger B
rilascia sempre DML a Table A
, sparando Trigger A
.
Trigger A
rilascia condizionalmente DML a Table B
, sparando Trigger B
.
Trigger B
rilascia condizionalmente DML a Table A
, sparando Trigger A
.
Trigger B
rilascia sempre DML a Table A
, sparando Trigger A
.
Se questo sembra complesso, tieni presente che "condizionatamente" può essere ulteriormente esteso a "è successo, ma potrebbe non accadere sempre" e "non è successo, ma può accadere altrove".
Per pg_trigger_depth()
essere utile, devi avere una serie di eventi allo stesso modo complessi. E, ora, vuoi che l'esecuzione dipenda dal contenuto dell'esecuzione in quella catena?
Lo eviterei. Se il tuo sistema di innesco è così complesso, stai giocando a patate calde con una bomba a mano in un armadio tutto da solo e non sembra che finisca bene.