Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server può inviare una richiesta Web?

È possibile, ma nel mondo reale è un po' più complicato dell'approccio ingenuo che immagini. In primo luogo, è inaccettabile che un trigger attenda una richiesta HTTP:

  • Per uno, la tua applicazione si arresterà bruscamente, perché i trigger bloccheranno le risorse (principalmente blocchi) in attesa di una risposta da qualche servizio WWW lontano e lontano.
  • Il secondo, più sottile ma di gran lunga peggiore, è il problema della correttezza in presenza di rollback. Se la transazione inviata alle richieste HTTP viene ripristinata, non c'è modo di "annullare" la richiesta HTTP.

La soluzione è disaccoppiare il trigger dalla richiesta HTTP tramite una coda. Il trigger accoda la richiesta in una coda locale ed esegue il commit, mentre un'elaborazione separata rimuove queste richieste ed emette la richiesta HTTP. Questo risolve entrambi i problemi sopra evidenziati. Puoi utilizzare tabelle ordinarie per le code (vedi Utilizzo delle tabelle come code) oppure puoi utilizzare Service Broker, entrambi funzionano bene.

Ora su come rimuovere dalla coda queste richieste ed effettivamente effettuare la chiamata HTTP, consiglio vivamente di utilizzare un processo dedicato (ad esempio un'applicazione dedicata a questo scopo). Sebbene sia possibile utilizzare SQLCLR, è una pessima scelta. Le risorse di SQL Server (in particolare i lavoratori) sono molto preziose da sprecare in attesa di risposte Internet.