web-dev-qa-db-fra.com

DLL tierce dans SQL Server CLR

J'ai besoin d'utiliser un tiers DLL 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?

14
AVEbrahimi

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 assembly en tant que SAFE, uniquement dans des circonstances exceptionnelles si vous utilisez EXTERNAL_ACCESS Ou 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 assemblys dynamiquement, car Assembly.Load() est délibérément restreint.
  4. Vous devrez peut-être vous assurer que la bibliothèque tierce est signée avec une clé publique si vous prévoyez d'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 effectué à 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.
15
Matthew Abbott

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.

Deploying CLR Database Objects sur MSDN détaille les options, y compris les instructions SQL et les scripts de déploiement.

5
Oded

J'utilise un très grand tiers DLL 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 le tiers DLL pour créer le PDF et acceptez l'URL et FilePath comme paramètres et renvoie le PDF taille et nombre de pages.

  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 ceux 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.

1
MikeTeeVee