2015-09-30 7 views
7

Ich habe eine gespeicherte SQL Server 2012-Prozedur, die eine Tabelle zurückgibt. Ich muss diesen SP ändern, um der zurückgegebenen Tabelle einen zusätzlichen Wert hinzuzufügen. Dieser Mehrwert kommt leider von einem Aufruf an einen Web-Service. Aus meiner Forschung, ich sammle die wichtigsten Möglichkeiten, dies zu tun sind die OLE-Automatisierung-Prozeduren (sp_OA ...) in SQL oder eine gespeicherte SQLCLR-Prozedur. Angesichts des Sicherheitskontexts, in dem die Prozeduren sp_OA ... ausgeführt werden, ist der einzelne Rückgabewert ein VARCHAR (10) -Registrierungsschlüssel, und Aufrufe an den Dienst sind wenige (zehn bis zwanzig pro Stunde), ich vermute, die SQLCLR-Methode ist der Weg, den man gehen sollte. Außerdem wird der Web-Service in unserem Intranet gehostet und ist für die Außenwelt nicht zugänglich.Web-Service von SQL CLR aufrufen?

Gibt es einen besseren Weg, um das zu erreichen, was ich brauche? Bessere Bedeutung mehr performant, bessere Sicherheit, einfacher zu codieren und zu pflegen

Antwort

6

Bitte verwenden Sie nicht die sp_OA* OLE-Automatisierungsprozeduren. Sie scheinen nicht offiziell veraltet zu sein, aber SQLCLR ersetzt sowohl die OLE-Automatisierungsprozeduren als auch die erweiterten Stored Procedures.

Ja, dies kann einfach genug in SQLCLR getan werden. Sie finden Beispiele zur Verwendung von WCF (wie in der Antwort von CodeCaster gezeigt) oder zur Verwendung von HttpWebRequest/HttpWebResponse (Ich habe mehr Informationen in dieser Antwort: How to invoke webservice from SQL Server stored procedure). Auch beachten Sie bitte, dass manchmal müssen Sie auch die Serialisierung Assembly hinzu: Using Webservices and Xml Serialization in CLR Integration

Codierung und Wartung
Web Services eine schöne API zur Verfügung stellen, aber wenn Sie die Struktur ändern müssen Sie neu kompilieren und erneut bereitstellen zu zumindest ein Teil davon. Wenn man annimmt, dass die Informationen, die ausgetauscht werden, einfach genug sind, tendiere ich zu der Annahme, dass dies als eine Standard-Web-Anfrage behandelt wird, was viel Flexibilität hinzufügt. Sie können eine generische Webanforderungsfunktion (Skalar oder TVF) erstellen, die die Parameter und den URI übernimmt und die ordnungsgemäß formatierte XML-Anforderung erstellt und an den URI sendet. Es erhält dann die Antwort und gibt nur das XML zurück. Sie verschieben also ein wenig die Verantwortung, da Sie jetzt die XML-Antwort analysieren müssen, anstatt ein nettes Objekt zu erhalten. Aber XML lässt sich in SQL Server leicht analysieren, und Sie können diese Funktion an beliebig vielen Stellen wiederverwenden. Und wenn der Remote-Service jemals aktualisiert wird, ist das Aktualisieren einer Stored Procedure zum Ändern der Abfragezeichenfolge, die an den Web Service übergeben wird, und/oder Ändern der Analyse der XML-Antwort ein einfaches ALTER PROCEDURE und sollte einfach zu testen sein. Sie müssen die SQLCLR-Assembly nicht erneut kompilieren/bereitstellen.

Sicherheit
Unabhängig davon, wie „reine“ eines Webdienstes rufen Sie wollen, die Hauptsache, Sicherheit klug, zu ist nicht faul sein und drehen TRUSTWORTHY ON (wie auch in der gelinkten Seite von @ gezeigt CodeCasters Antwort, und leider die meisten anderen Beispiele hier auf den Interwebs).Der richtige Weg, dies sicher zu machen ist, Folgendes zu tun:

  • Anmeldung Ihre Versammlung
  • In der [master] Datenbank, einen asymmetrischen Schlüssel aus der DLL Ihrer Assembly erstellen.
  • Auch in [master], erstellen Sie eine Anmeldung aus, dass Asymmetric Key
  • Erteilen Ihren Zugangsdaten die EXTERNAL ACCESS ASSEMBLY Erlaubnis
  • Erstellen Sie Ihre Assembly mit einem PERMISSION_SET von EXTERNAL_ACCESS, nichtUNSAFE
1

Sie können definitiv call a WCF service using SQL CLR.

Wenn Sie das nicht möchten, könnten Sie einen Windows-Dienst in C# watches or polls the table for changes schreiben. Je nachdem, wie Sie diesen Service implementieren, wäre die Reaktion auf einen neuen Datensatz nahezu unmittelbar. Lesen Sie auch How to notify a windows service(c#) of a DB Table Change(sql 2005)?.

Dann können Sie den Service-Aufruf von C# ausführen, die erforderliche Arbeit ausführen und das Ergebnis in der Spalte speichern.

Wenn Sie weitere Informationen benötigen, z. B. zusätzliche Variablen, die während des Austauschs erhalten werden, können Sie eine neue Tabelle zum Speichern und das tatsächliche Ergebnis einfügen. Fügen Sie dann die Tabelle aus der Tabelle in Ihre Frage ein.

Verwandte Themen