2015-09-30 20 views
7

Ho una stored procedure SQL Server 2012 che restituisce una tabella. Devo modificare tale SP per aggiungere un valore aggiuntivo alla tabella restituita. Sfortunatamente, questo valore aggiunto deriva da una chiamata a un servizio web. Dalla mia ricerca, ho raccolto i modi principali per farlo utilizzando le procedure di automazione OLE (sp_OA ...) in SQL o una stored procedure SQLCLR. Dato il contesto di sicurezza in cui vengono eseguite le procedure sp_OA ..., il valore di ritorno singolo è una chiave di registrazione VARCHAR (10) e le chiamate al servizio sono poche (da dieci a venti all'ora), suppongo che il metodo SQLCLR sia la strada da percorrere Inoltre, il servizio web è ospitato sulla nostra intranet e non è accessibile al mondo esterno.Chiama il servizio web da SQL CLR?

Esiste un modo migliore per realizzare ciò di cui ho bisogno? Migliore significato più performante, migliore sicurezza, più facile da codificare e mantenere

risposta

6

Si prega di non utilizzare le procedure di automazione OLE sp_OA*. Non sembrano essere ufficialmente deprecati, ma SQLCLR sostituisce sia le procedure di automazione OLE sia le stored procedure estese.

Sì, questo può essere fatto abbastanza facilmente in SQLCLR. Puoi trovare esempi sull'uso di WCF (come mostrato nella risposta di @ CodeCaster) o sull'uso di HttpWebRequest/HttpWebResponse (ho più informazioni in questa risposta: How to invoke webservice from SQL Server stored procedure). Inoltre, si prega di essere consapevoli del fatto che a volte è necessario aggiungere anche l'assembly di serializzazione: Using Webservices and Xml Serialization in CLR Integration

Codifica e manutenzione
Web Services forniscono un bel API, ma se si modifica la struttura si dovrà ricompilare e ridistribuire a almeno una parte di questo. Supponendo che le informazioni scambiate siano abbastanza semplici, tendo a pensare che trattarle come una richiesta web standard aggiunga molta flessibilità. È possibile creare una funzione di richiesta Web generica (scalare o TVF) che includa i parametri e l'URI e costruisca la richiesta XML correttamente formattata e la invii all'URI. Quindi ottiene la risposta e restituisce semplicemente l'XML. Quindi si sposta un po 'di responsabilità dal momento che ora è necessario analizzare la risposta XML piuttosto che ottenere un oggetto piacevole. Tuttavia, XML è facile da analizzare in SQL Server e puoi riutilizzare questa funzione in qualsiasi numero di posizioni. Inoltre, se il servizio remoto viene aggiornato, aggiornare una stored procedure per modificare la stringa di query passata al servizio Web e/o modificare l'analisi della risposta XML è una semplice procedura ALTER e dovrebbe essere facile da verificare. Non è necessario ricompilare/ridistribuire il gruppo SQLCLR.

Security
Indipendentemente da come "pura" di un servizio Web Call si desidera, la cosa principale, la sicurezza saggio, è quello di NON essere pigro e girare TRUSTWORTHY ON (come mostrato anche nella pagina collegata da @ La risposta di CodeCaster, e sfortunatamente la maggior parte degli altri esempi qui sull'interwebs).Il modo corretto per rendere questo sicuro è quello di effettuare le seguenti operazioni:

  • Iscriviti vostra Assemblea
  • Nel database [master], creare una chiave asimmetrica dalla DLL della vostra Assemblea.
  • Inoltre [master], creare un accesso da quella asimmetrica Key
  • Fa 'un nuovo login al EXTERNAL ACCESS ASSEMBLY permesso
  • Create la vostra Assemblea con un PERMISSION_SET di EXTERNAL_ACCESS, nonUNSAFE
1

Si può sicuramente call a WCF service using SQL CLR.

Se non si desidera, è possibile scrivere un servizio di Windows in C# che watches or polls the table for changes. A seconda di come si implementa questo servizio, la reazione a un nuovo record sarebbe quasi immediata. Leggi anche How to notify a windows service(c#) of a DB Table Change(sql 2005)?.

Quindi è possibile eseguire la chiamata di servizio da C#, eseguire il lavoro richiesto e memorizzare il risultato nella colonna.

Quando si richiedono ulteriori informazioni, ad esempio variabili extra ottenute durante lo scambio, è possibile introdurre una nuova tabella per la memorizzazione di quello e il risultato effettivo a cui si è interessati. Quindi partecipare alla tabella dalla tabella nella domanda.