durch eine erneute Implementierung eines .NET-assembly enthält die CLR-gespeicherte Prozeduren
Ich geschrieben habe, eine CLR-gespeicherte Prozedur, die in einer assembly.
Habe ich ein build-system, das automatische erstellen und bereitstellen .net-Anwendung aus unserem source-control-repository.
Möchte ich die beiden Dinge zusammen zu arbeiten, so kann ich erneut bereitstellen Sie, die Versammlung, dass die Gastgeber die CLR-gespeicherte Prozedur.
Aber wie es aussieht, im Gegensatz zu IIS, ersetzt einfach die binaries nicht funktioniert. Es scheint, wie Sie haben, um die DROP-MONTAGE auf der Datenbank. Um das zu tun , dass müssen Sie löschen alle Objekte, die auf diese assembly verweisen.
Dass es vernünftig erscheint, in einer Weise, D. H., aus einer Datenbank Integrität Sicht-und unangemessen, in einem anderen -- der JIT-Ansatz, gilt für die Laufzeit der Auswertung von Abhängigkeiten für die .NET im Allgemeinen.
So, ist es möglich, etwas zu tun, so kann ich ersetzen die binäre dann geben Sie die SQL server-kick und machen es herauszufinden, dass der neue Aufbau erfüllt alle Anforderungen, (d.h., hat das Recht, die öffentlichen namespaces, Typen, Methoden usw. zu befriedigen, die sprocs an diese gebunden sind).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Antwort ist 'Nein, es wird nicht auf diese Art und Weise'. Wie es war, wies Remus, SQL-Server speichert Assemblys in Ihre Datenbank und nicht irgendwo in einem file-system. Folglich gibt es keinen Ort, der überwacht wird, indem die server und wo sollten Sie Platz aktualisierte Binärdateien.
Hochladen einer aktualisierten Baugruppe(N) der Datenbank sollte ein integraler Bestandteil der deployment-Prozess. Und der einzige Weg, es zu tun, um die folgenden Aktionen auszuführen ausdrücklich:
Schritt 1 können auch tatsächlich umgesetzt werden in T-SQL in eine generische Art (so dass Sie nicht haben, um die Liste Objekte explizit). Aber es ist kein Weg für p.4 mit Ausnahme von custom-Tools (die reflektion verwenden, um zu entdecken, Montage Inhalt und generiert die entsprechenden T-SQL für die Erstellung aller Objekte).
Den CLR-Assemblys werden in der Datenbank gespeichert, nicht auf der Festplatte, so dass Sie nicht einfach ersetzen einige binäre dll. Aktualisieren Sie Sie
ALTER ASSEMBLY [assemblyname] FROM 'disklocation'
.Als Remus ' Antwort Staaten, die Sie verwenden können
ALTER ASSEMBLY ...
eine assembly zu aktualisieren.Aus der MSDN-Seite ALTER ASSEMBLY (Transact-SQL) für den SQL Server 2008 R2 [Hervorhebung von mir]:
So, wenn die Funktionen, gespeicherte Prozeduren, etc. dass auf die assembly verweisen, haben sich nicht geändert, Sie kann einfach aktualisieren Sie die assembly. Auch, dabei nicht zu stören derzeit Laufenden Sitzungen; aus dem gleichen MSDN-Seite wie oben erwähnt:
Allerdings könnte man relativ leicht re-implementieren Sie eine assembly und Ihre abhängigen Objekte automatisch, sondern zu tun, im Allgemeinen, Sie würde benötigen, zu löschen und neu zu erstellen. Wenn Sie dies tun, können Sie finden es einfacher, stellen Sie die assembly von 'Einbettung' in ein Skript, indem zuerst die bytes von der assembly-Datei in hexadezimal-Ziffern, die dann in der betreffenden
CREATE ASSEMBLY
- Anweisung.Ich Stimme mit dem, was AlexS vorgeschlagen, außer dem letzten Satz.
Zuerst aus, die Reflexion wird nicht wirklich funktionieren, da die verwendeten Datentypen in der CLR-Funktionen bestimmen nicht unbedingt den SQL-Datentypen. Zum Beispiel könnten Sie haben SqlString auf die CLR-Seite, aber verwenden Sie NVARCHAR(50) oder NVARCHAR(MAX) statt NVARCHAR(4000) auf der Seite SQL.
Allerdings ist es immer noch möglich, dies zu automatisieren. Sie sollten mit dem source code repository zu speichern die Gespeicherte Prozedur-und Funktionsdefinitionen, die auf die CLR-code, wie jede andere Gespeicherte Prozedur oder Funktion. Man könnte also schnappen Sie sich all diese Definitionen und führen Sie alle von der CREATE PROCEDURE und CREATE FUNCTION-Anweisungen wie in Schritt 4.
Auch, die Schritte 1 und 2 kann eine einzelne SQL-Skript.
Im wesentlichen ist dieser gesamte Prozess kann automatisiert werden :).