Comment puis-je mettre à jour une dll d'assembly de fonction (ou procédure) CLR sans avoir à supprimer et recréer l'assembly dans SQL Server (2008 R2)?
Dans l'état actuel des choses si je mets à jour un assembly (par exemple pour ajouter une nouvelle fonction), SQL Server n'honorera pas la DLL mise à jour tant que je n'aurai pas déposé l'assembly:
DROP ASSEMBLY CLRFunctions
Msg 6590, Level 16, State 1, Line 1
DROP ASSEMBLY failed because 'CLRFunctions' is referenced by object 'NormalizeString'.
Mais avant de pouvoir supprimer l'assembly, je dois d'abord supprimer toutes les fonctions qui y font référence:
DROP FUNCTION NormalizeString
DROP FUNCTION RemoveDiacritics
DROP FUNCTION RemoveCombiningDiacritics
DROP FUNCTION CombineLigatures
....
DROP FUNCTION PseudolocalizeArabic
Et puis je peux déposer l'assemblage:
DROP ASSEMBLY CLRFunctions
Maintenant je dois " créer " l'assemblage:
CREATE ASSEMBLY CLRFunctions FROM 'c:\foos\CLRFunctions.dll';
Et maintenant, je dois rechercher la déclaration de tous les UDF qui ont été enregistrés avant de les supprimer.
je préfère mettre à jour un assemblage et demander à SQL Server de commencer à l'utiliser.
Mise à jour : j'ai essayé DBCC FREEPROCCACHE
au hasard de forcer une "recompilation", mais SQL Server utilise toujours l'ancien code.
Mise à jour : j'ai supprimé la DLL d'assembly CLRFunctions.dll
et SQL Server est toujours en mesure d'exécuter le code (sans code qui devrait être impossible).
la source
CREATE ASSEMBLY
etALTER ASSEMBLY
prendront un blob qui représente l'assembly. Prouvez-le vous-même en accédant à n'importe quelle base de données créée sur 2008+ et accédez à Programmabilité -> Assemblys et créez un script pour la création de l'assembly Microsoft.SqlServer.Types. Ce gigantesque varbinaire est l'assemblage . Comme cela s'applique à votre situation, déployez votre assembly sur votre instance locale, créez unALTER ASSEMBLY
script et faites-en un script.Pour compléter la réponse de Ben Thul, cela peut être accompli à distance assez facilement via l'interface graphique de SQL Server Management Studio .
Sous l'Explorateur d'objets pour votre base de données -> Programmabilité, cliquez avec le bouton droit sur Assemblys et sélectionnez 'New Assembly ...'.
Accédez à votre DLL mise à jour.
Au lieu de cliquer sur «OK» (ce qui échouera, car un assemblage du même nom existe déjà), cliquez sur «Script» en haut de la fenêtre Nouvel assemblage.
Vous serez déposé dans une requête SQL qui comprend une ligne 'CREATE ASSEMBLY' suivie d'un énorme blob qui est la DLL que vous venez de sélectionner.
Changez 'CREATE' en 'ALTER' puis exécutez!
Le script a également créé une ligne «AUTORISATION» pour moi que j'ai dû supprimer avant de l'exécuter; votre kilométrage peut varier.
J'espère que cela aide quelqu'un d'autre sans accès au système de fichiers à ses serveurs.
Espérons que Microsoft en fera un jour une opération de première classe dans SSMS, mais c'est une solution de contournement assez facile jusqu'à ce qu'ils le fassent.
la source
j'ai trouvé un indice sur la réponse sur Stackoverflow :
la source
ALTER ASSEMBLY
UPDATE
ALTER