DLL tierce dans SQL Server CLR

14

J'ai besoin d'utiliser une DLL tierce dans un code déclencheur c # dans SQL Server CLR

Mais lorsque j'essaie d'ajouter une référence, cela montre simplement quelques DLL de SQL Server.

Comment puis-je ajouter ma DLL tierce à SQL Server?

Solomon Rutzky
la source
2
De la même manière que vous ajoutez des assemblys SQL CLR ?

Réponses:

14

Vous pouvez uniquement ajouter des références aux assemblys qui ont été enregistrés auprès de Sql Server. S'ils ne sont pas enregistrés, ils n'apparaîtront pas dans la boîte de dialogue Ajouter des références.

Il y a un certain nombre d'étapes que vous devrez effectuer pour enregistrer une DLL, vous devrez d'abord reconfigurer votre base de données:

ALTER DATABASE [MyDatabase] SET TRUSTWORTHY ON;
sp_configure 'clr enabled', 1;
RECONFIGURE;

Une fois cela fait, Sql Server est activé CLR. Ensuite, vous devrez enregistrer votre assemblage:

CREATE ASSEMBLY [MyAssembly] AUTHORIZATION [MyUser]
FROM 'C:\CLR\MyAssembly.dll'
WITH PERMISSION_SET = SAFE

Si ce dernier script s'exécute correctement, l'assembly est maintenant enregistré et apparaîtra dans la boîte de dialogue Ajouter des références.

Ce que vous devrez cependant prendre en compte, c'est la sécurité des applications de votre configuration Sql Server CLR:

  1. Vous préférez enregistrer un assemblage sous SAFE, uniquement dans des circonstances exceptionnelles si vous utilisez EXTERNAL_ACCESSou UNSAFE.
  2. Ne vous attendez pas à pouvoir faire tout ce que vous pouvez sur le CLR de confiance totale (c'est-à-dire pas le CLR hébergé par Sql Server) - le SQLCLR est un runtime en bac à sable.
  3. N'essayez pas de charger des assemblages de manière dynamique, car cela Assembly.Load()est volontairement restreint.
  4. Vous devrez peut-être vous assurer que la bibliothèque tierce est signée avec une clé publique si vous prévoyez de l'utiliser UNSAFE.
  5. L'exécution du code s'exécute dans le contexte de l'identité du service exécutant Sql Server (je pense!)
  6. L'accès à la base de données à partir d'un assembly hébergé (par exemple via context connection = true;) s'exécute dans le contexte de l'utilisateur connecté, vous devez donc vous assurer que vous êtes au courant de l'accès de cette bibliothèque à vos données.
Matthew Abbott
la source
en 4 ci-dessus vous écrivez vous devez signer l'assemblée. Je reçois cette partie, et j'ai pu le faire via des instructions auto-signées ici: geekswithblogs.net/ktegels/archive/2006/02/16/… Mais comment installer le certificat lorsque vous n'avez pas la clé privée, c'est-à-dire lorsque assemblage a été créé et signé par un tiers de confiance? Pour autant que je sache dans le lien ci-dessus, la création du certificat nécessite la présence d'une clé privée. Cela semble rendre cela impossible?
JorgeSandoval
2
De plus, le fait de marquer db comme fiable est risqué (et inutile pour une installation d'assemblage "sûre"). Trustworthy est un moyen d'éviter de signer des assemblys pour des autorisations externes / dangereuses, mais n'est pas recommandé car tout assemblage CLR installé sera fiable ...
JorgeSandoval
5

Je suppose que vous posez des questions sur les alternatives à l'installation des assemblys SQL CLR à partir de Visual Studio.

Il n'est pas nécessaire d'avoir le code dans Visual Studio.

Le déploiement d'objets de base de données CLR sur MSDN détaille les options, y compris les instructions SQL et les scripts de déploiement.

Oded
la source
1

J'utilise une très grande DLL tierce qui prend une page Web et la convertit en PDF.

Le PDF est enregistré sur un partage de fichiers et la base de données est mise à jour quant à son emplacement et son type.

Il s'agit d'un processus en 3 étapes:

  1. Créez une application console qui utilise la DLL tierce pour créer le PDF et accepter l'URL et FilePath comme paramètres et renvoie la taille et le nombre de pages du PDF.

  2. Créer une procédure stockée CLR qui appelle ensuite l'application console sur le serveur

  3. J'enveloppe tout cela dans une seule procédure stockée qui appelle l'application CLR pour créer le PDF, puis j'écris des métadonnées à ce sujet dans la base de données.

Je me rends compte que ce n'est pas parfait et en aucun cas vous ne devriez faire quelque chose d'aussi fou dans un déclencheur!

Je ne le mentionne ici que pour d'autres qui ont des questions sur l'utilisation de DLL tierces dans leur CLR.

Mon espoir est qu'en faisant tourner une console cmd.exe pour exécuter la DLL tierce, au lieu d'exécuter tout en cours, si elle se bloque, cela n'affectera pas autant SQL Server. Voilà ce que j'espère.

Veuillez commenter s'il s'agit d'une très mauvaise approche et pourquoi.

MikeTeeVee
la source