Hoogstwaarschijnlijk moeten al die Assemblies worden ingesteld op UNSAFE
, vooral de drie System.DirectoryServices* .NET Framework-bibliotheken die u hebt geïmporteerd. En aangezien u niet-ondersteunde .NET Framework-bibliotheken
importeert , moet u de database instellen op TRUSTWORTHY ON
om ze aan het werk te krijgen. Een database instellen op TRUSTWORTHY ON
is typisch iets dat je wilt vermijden, omdat het een veiligheidsrisico is, maar in dit geval geloof ik niet dat het kan worden vermeden.
Dat gezegd hebbende, weet ik niet zeker of je deze functie zelfs zelf in SQLCLR moet maken. Als u alleen wilt weten of een Login (uiteraard alleen Windows Logins) tot een bepaalde Active Directory-groep behoort, is er een ingebouwde functie die moet doe dat voor je. De IS_MEMBER
functie zal aangeven of de huidige Login is een lid van de opgegeven Windows-groep (aangegeven als Domain\Group
). Het verschil in hoe deze functie werkt in tegenstelling tot de functie die u aan het maken bent, is dat deze alleen werkt voor de huidige Login; u kunt er geen willekeurige Login in doorgeven. MAAR, het vereist ook geen van de extra inspanningen en veiligheidsrisico's die deel uitmaken van dit SQLCLR-oplossing. Dus iets om over na te denken :-).
Commentaar van O.P. op dit antwoord:
Maak in dat geval de Dynamic SQL gewoon twee lagen diep in plaats van de gebruikelijke één laag. Iets in de trant van:
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);
In deze benadering wordt de query die OPENQUERY
. uitvoert, is Dynamic SQL, maar de query gegeven aan OPENQUERY
uitvoeren is een letterlijke tekenreeks.