Microsoft SQL Server-API

Microsoft SQL Server-API

Ich habe eine Idee für eine Anwendung, aber im Idealfall würde diese darauf beruhen, dass man eine Art „SQL-Rewriting“-Engine für MSSQL schreiben könnte (ähnlich wie HTTP-Server über „URL-Rewriting“-Module verfügen können), die SQL-Anweisungen schneiden könnte, bevor der Server sie verarbeitet, und zuerst anderen Code ausführen könnte.

Ist dies mit MSSQL überhaupt möglich oder muss ich einen alternativen Weg verfolgen, um mein Ziel zu erreichen?

Antwort1

Die Frage ist nicht, „wie“ Sie eine Umschreibung vornehmen, sondern „wo“ Sie die Umschreibung vornehmen möchten. Sie sagten, Sie möchten etwas wie in IIS, aber das ist in MSSQL nicht möglich. In IIS haben Sie eine Pipeline zur Anforderungsverarbeitung und es gibt viele Punkte, an denen Sie Ihren benutzerdefinierten Code in diese Pipeline einfügen können (z. B. erstellen Sie Ihre eigene ISAPI-Erweiterung, HTTPModule, Ereignisse in Global.asax).

In SQL Server gibt es keine SQL-Pipeline, die für Entwickler geöffnet wird. Wenn eine SQL-Anfrage an den SQL-Server geht, können Sie sie nicht neu schreiben. Trigger VOR oder STATT Update/Einfügen/Löschen lösen das Problem nicht, wenn Sie den Tabellennamen in der ursprünglichen Abfrage ersetzen möchten, denn wenn diese Tabelle nicht existiert, erhalten Sie eine Ausnahme, bevor Sie eine benutzerdefinierte Geschäftslogik in Triggern ausführen können.

Sie können SQL jedoch auf dem Client (nicht auf dem SQL-Server) „neu schreiben“, indem Sie den benutzerdefinierten Datenprovider erstellen (wenn Sie eine ADO.NET-Anwendung haben). SieheMSDN - Implementieren eines .NET Framework-Datenanbieters. Dies ist keine leichte Aufgabe und erfordert viel Aufwand. In Ihrem Code können Sie die meisten Standardfunktionen des standardmäßigen MSSQL-Datenproviders (System.Data.SqlClient) wiederverwenden und nur Funktionen überschreiben, bei denen Sie SQL analysieren und bestimmte Befehle ersetzen möchten.

Bitte schauen Sie auch aufhttp://sqlfaultretryprovide.codeplex.com/- Ziel dieses Projekts war es, einen benutzerdefinierten .NET-Datenprovider für SQL Server zu erstellen, der automatisch die Funktion „Bei Fehlern erneut versuchen“ bereitstellt. Dies ist also kein SQL-Rewriter, kann aber als Beispiel für die Erstellung eines eigenen verwendet werden.

Antwort2

Sie könnenlöst ausfür INSERT, UPDATE und DELETE, aber es gibt keinen entsprechenden Auslöser für SELECT.

Ein alternativer Ansatz wäre, ein Programm zu schreiben, das abfängtTDS-Anrufe, ändert sie und leitet sie an den SQL-Server weiter. Sie würden also Ihr Programm auf Port 1433 oder so abhören lassen und in Ihrem Setup-Programm den SQL-Server-Port so ändern, dass er auf Port 1434 abhört.

Antwort3

Sie möchten wahrscheinlich eine Business-Schicht in SQL erstellen. Wenn Sie versuchen, eine vorhandene App zu ändern, kann es zu Problemen kommen, da die SQL-Adapter alle proprietär sind. Wenn Ihre Apps jedoch geändert werden können, können Sie wahrscheinlich eine Business-Schicht schreiben, die auf der Datenbank sitzt und die Befehle über eine gemeinsam genutzte Speicherverbindung in den SQL-Server einspeist.

Eine weitere Option ist eine magische gespeicherte CLR-Prozedur, in die Sie das SQL einspeisen, das es dann bearbeitet und für die SQL-Datenbank ausführt (mithilfe einer Kontextverbindung, die sogar noch schneller ist als der gemeinsam genutzte Speicher).

Bedenken Sie jedoch, dass der SQL-Server ziemlich gut geschrieben ist. So etwas wie das von Ihnen gewünschte lässt sich wahrscheinlich am besten auf dem Client mithilfe einer API erreichen, sodass die Verarbeitung entsprechend der Anzahl der Clients verteilt wird und der SQL-Server das tatsächlich ausgeführte SQL optimieren kann.

Antwort4

Sie können Trigger schreiben, die .NET-Klassen verwenden.

http://www.15seconds.com/issue/041006.htm

http://aspalliance.com/1273_CLR_Triggers_for_SQL_Server_2005.all

http://www.google.com/search?rlz=1C1_____enUS397US397&sourceid=chrome&ie=UTF-8&q=sql+.net+trigger

viel Glück.

verwandte Informationen