Très probablement, tous ces assemblages devront être définis sur UNSAFE
, en particulier les trois System.DirectoryServices* Bibliothèques .NET Framework que vous avez importées. De plus, puisque vous importez des des bibliothèques .NET Framework non prises en charge
, vous devrez définir la base de données sur TRUSTWORTHY ON
afin de les faire travailler. Définition d'une base de données sur TRUSTWORTHY ON
est généralement quelque chose que vous voulez éviter car il s'agit d'un risque pour la sécurité, mais dans ce cas, je ne pense pas que cela puisse être évité.
Cela dit, je ne suis pas sûr que vous ayez même besoin de créer cette fonction vous-même dans SQLCLR. Si vous voulez simplement savoir si une connexion (connexions Windows uniquement, évidemment) appartient à un groupe Active Directory particulier, il existe une fonction intégrée qui devrait fais ça pour toi. Le IS_MEMBER
la fonction indiquera si le courant La connexion est membre du groupe Windows spécifié (spécifié comme Domain\Group
). La différence dans le fonctionnement de cette fonction par rapport à celle que vous créez est qu'elle ne fonctionne que pour la connexion actuelle ; vous ne pouvez pas y transmettre de connexion arbitraire. MAIS, cela ne nécessite aucun des efforts supplémentaires et des risques de sécurité qui font partie de ceci Solution SQLCLR. Donc, quelque chose à considérer :-).
Commentaire d'O.P. sur cette réponse :
Dans ce cas, créez simplement le SQL dynamique en deux couches au lieu de la couche habituelle. Quelque chose comme :
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = N'
SELECT *
FROM OPENQUERY([LinkedServer], N''
SELECT *
FROM someResource
WHERE GroupName=N''''' + @Group + N'''''
AND ObjectName=N''''' + @Login + N''''';
'');
';
PRINT @SQL; -- DEBUG
EXEC (@SQL);
Dans cette approche, la requête exécutant OPENQUERY
est Dynamic SQL, mais la requête donnée à OPENQUERY
à exécuter est un littéral de chaîne.