Най-вероятно всички тези сборки ще трябва да бъдат зададени на UNSAFE
, особено трите System.DirectoryServices* .NET Framework библиотеки, които сте импортирали. Освен това, тъй като импортирате неподдържани библиотеки на .NET Framework
, ще трябва да настроите базата данни на TRUSTWORTHY ON
за да ги накарате да работят. Задаване на база данни на TRUSTWORTHY ON
обикновено е нещо, което искате да избегнете, тъй като е риск за сигурността, но в този случай не вярвам, че може да бъде избегнато.
Въпреки това не съм сигурен, че дори трябва да създадете тази функция сами в SQLCLR. Ако просто искате да знаете дали дадено влизане (само за влизане в Windows, очевидно) принадлежи към определена група на Active Directory, има вградена функция, която трябва направи това за теб. IS_MEMBER
функция ще покаже дали текущият Login е член на посочената група Windows (посочена като Domain\Group
). Разликата в начина, по който работи тази функция за разлика от тази, която създавате е, че тя работи само за текущото влизане; не можете да подадете произволен вход в него. НО също така не изисква никакви допълнителни усилия и рискове за сигурността, които са част от това SQLCLR решение. И така, нещо, което трябва да имате предвид :-).
Коментар от O.P. за този отговор:
В такъв случай просто направете Dynamic SQL на два слоя вместо обичайния един слой. Нещо от рода на:
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);
При този подход заявката, изпълняваща OPENQUERY
е Dynamic SQL, но заявката, дадена на OPENQUERY
за изпълнение е низов литерал.