web-dev-qa-db-fra.com

Comment mettre à jour un assemblage CLR sans suppression de l'assemblage de SQL Server

Comment mettre à jour une DLL de la fonction CLR (ou de la procédure) sans avoir à déposer et à recréer l'assemblage dans SQL Server (2008 R2)?

Comme je me trouve maintenant si je mettez à jour un assemblage (par exemple pour ajouter une nouvelle fonction), SQL Server n'honorera pas à la DLL mise à jour jusqu'à ce que je dépose l'assemblage:

DROP Assembly CLRFunctions

Msg 6590, Level 16, State 1, Line 1
DROP Assembly failed because 'CLRFunctions' is referenced by object 'NormalizeString'.

Mais avant que je puisse laisser tomber l'assemblage, je dois d'abord laisser tomber toutes les fonctions qui le fait référence:

DROP FUNCTION NormalizeString
DROP FUNCTION RemoveDiacritics
DROP FUNCTION RemoveCombiningDiacritics
DROP FUNCTION CombineLigatures
....
DROP FUNCTION PseudolocalizeArabic

Et (( alors Je peux laisser tomber l'assemblage:

DROP Assembly CLRFunctions

Maintenant, je dois " Créer " L'Assemblée:

CREATE Assembly CLRFunctions FROM 'c:\foos\CLRFunctions.dll';

Et maintenant, je dois chasser la déclaration de tous les UDF que étaient enregistrés avant que je les ai supprimés.

je préférerais Mise à jour Assemblée et que SQL Server commence à l'utiliser.


Mise à jour: J'ai essayé au hasard DBCC FREEPROCCACHE Pour forcer une "recompilation", mais SQL Server utilise toujours l'ancien code.

Mise à jour: J'ai supprimé la dll d'assemblage CLRFunctions.dll et SQL Server est toujours capable d'exécuter le code (sans code qui devrait être impossible).

20
Ian Boyd

Je pense que vous cherchez alter Assembly. De bol:

Si la clause de provenance est spécifiée, Alter Assemblage met à jour l'assemblage par rapport aux dernières copies des modules fournis. Comme il peut y avoir des fonctions CLR, des procédures stockées, des déclencheurs, des types de données et des fonctions d'agrégat définies par l'utilisateur dans l'instance de SQL Server déjà définie à l'encontre de l'Assemblée, la déclaration de montage d'altération les renvoie à la dernière mise en œuvre de l'Assemblée. Pour accomplir cette reproduction, les méthodes décrivant les fonctions CLR, les procédures stockées et les déclencheurs doivent encore exister dans l'assemblage modifié avec les mêmes signatures. Les classes qui implémentent des types définis par l'utilisateur CLR et des fonctions d'agrégat définies par l'utilisateur doivent toujours satisfaire aux exigences relatives à un type ou à un agrégat défini par l'utilisateur.

L'un des exemples de la même page semble être le truc:

ALTER Assembly ComplexNumber 
FROM 'C:\Program Files\Microsoft SQL Server\90\Tools\Samples\1033\Engine\Programmability\CLR\UserDefinedDataType\CS\ComplexNumber\obj\Debug\ComplexNumber.dll' 
17
Ben Thul

Pour ajouter à la réponse de Ben Thul, cela peut être accompli à distance assez facilement via GUI SQL Server Management Studio.

  1. Sous l'explorateur d'objet pour votre base de données -> Programmabilité, cliquez avec le bouton droit de la souris sur les assemblages et sélectionnez "Nouveau montage ...".

  2. Accédez à votre DLL mise à jour.

  3. Au lieu de cliquer sur 'OK' (qui échouera, comme un assemblage du même nom existe déjà) Cliquez sur "Script" en haut de la nouvelle fenêtre d'assemblage.

    [.____] Vous serez déposé dans une requête SQL qui inclut une ligne de "création d'assemblage" suivie d'une énorme blob qui est la DLL que vous venez de sélectionner.

  4. Changer 'Créer' pour "Alter" puis exécuter!

Le script a également créé une ligne de "autorisation" pour moi que je devais supprimer avant d'exécuter; Votre miliolier peut varier.

J'espère que cela aidera quelqu'un d'autre sans accès au système de fichiers à leurs serveurs.

Espérons que Microsoft en fera une opération de première classe dans SSMS un jour, mais c'est une solution de contournement assez facile jusqu'à ce qu'ils soient.

8
F. Shinn

j'ai trouvé un indice à la réponse sur Stackoverflow :

ALTER Assembly CLRFunctions FROM 'c:\foos\CLRFunctions.dll';
1
Ian Boyd