Wie kann ich eine CLR-Funktions- (oder Prozedur-) Assembly-DLL aktualisieren, ohne die Assembly in SQL Server (2008 R2) löschen und neu erstellen zu müssen?
Wie es jetzt steht, wenn ich eine Assembly aktualisiere (z. B. um eine neue Funktion hinzuzufügen), wird SQL Server die aktualisierte DLL nicht berücksichtigen, bis ich die Assembly lösche:
DROP ASSEMBLY CLRFunctions
Msg 6590, Level 16, State 1, Line 1
DROP ASSEMBLY failed because 'CLRFunctions' is referenced by object 'NormalizeString'.
Aber bevor ich die Assembly löschen kann, muss ich zuerst alle Funktionen löschen , die darauf verweisen:
DROP FUNCTION NormalizeString
DROP FUNCTION RemoveDiacritics
DROP FUNCTION RemoveCombiningDiacritics
DROP FUNCTION CombineLigatures
....
DROP FUNCTION PseudolocalizeArabic
Und dann kann ich die Baugruppe fallen lassen:
DROP ASSEMBLY CLRFunctions
Jetzt muss ich die Baugruppe " erstellen ":
CREATE ASSEMBLY CLRFunctions FROM 'c:\foos\CLRFunctions.dll';
Und jetzt muss ich die Deklaration aller UDFs suchen, die registriert wurden , bevor ich sie löschte.
Ich würde lieber eine Assembly aktualisieren und SQL Server damit beginnen lassen, sie zu verwenden.
Update : Ich habe zufällig versucht DBCC FREEPROCCACHE
, eine "Neukompilierung" zu erzwingen, aber SQL Server verwendet immer noch den alten Code.
Update : Ich habe die Assembly-DLL gelöscht CLRFunctions.dll
und SQL Server ist weiterhin in der Lage, den Code auszuführen (ohne Code, der unmöglich sein sollte).
quelle
CREATE ASSEMBLY
undALTER ASSEMBLY
nehmen einen Blob, der die Assembly darstellt. Stellen Sie dies selbst unter Beweis, indem Sie zu jeder ab 2008 erstellten Datenbank gehen und unter Programmierbarkeit -> Assemblys die Erstellung der Microsoft.SqlServer.Types-Assembly per Skript ausführen. Das gigantische Varbinary ist die Versammlung . Da dies auf Ihre Situation zutrifft, stellen Sie Ihre Assembly auf Ihrer lokalen Instanz bereit, skripten Sie sie aus und machen Sie sie zu einemALTER ASSEMBLY
Skript.Um die Antwort von Ben Thul zu ergänzen, kann dies relativ einfach über die grafische Benutzeroberfläche von SQL Server Management Studio aus der Ferne erfolgen .
Klicken Sie im Objekt-Explorer Ihrer Datenbank -> Programmierbarkeit mit der rechten Maustaste auf Baugruppen und wählen Sie 'Neue Baugruppe ...'.
Navigieren Sie zu Ihrer aktualisierten DLL.
Anstatt auf "OK" zu klicken (was fehlschlägt, da bereits eine Baugruppe mit demselben Namen vorhanden ist), klicken Sie oben im Fenster "Neue Baugruppe" auf "Skript".
Sie werden zu einer SQL-Abfrage weitergeleitet, die eine Zeile 'CREATE ASSEMBLY' gefolgt von einem riesigen Blob enthält, bei dem es sich um die gerade ausgewählte DLL handelt.
Ändern Sie 'CREATE' in 'ALTER' und führen Sie dann aus!
Das Skript hat auch eine AUTHORIZATION-Zeile für mich erstellt, die ich vor der Ausführung entfernen musste. Ihre Laufleistung kann variieren.
Ich hoffe das hilft jemand anderem ohne Dateisystemzugriff auf ihre Server.
Hoffentlich wird Microsoft dies eines Tages zu einem erstklassigen Vorgang in SSMS machen, aber dies ist eine ziemlich einfache Umgehung, bis sie dies tun.
quelle
Ich habe einen Hinweis auf die Antwort auf Stackoverflow gefunden :
quelle
ALTER ASSEMBLY
... (UPDATE
ist in DML,ALTER
ist in DDL.)