Muito provavelmente, todos esses Assemblies precisarão ser definidos como
UNSAFE
, especialmente os três System.DirectoryServices* Bibliotecas do .NET Framework que você importou. Além disso, como você está importando bibliotecas .NET Framework não suportadas
, você precisará definir o banco de dados para TRUSTWORTHY ON
para fazê-los funcionar. Configurando um banco de dados para TRUSTWORTHY ON
normalmente é algo que você deseja evitar, pois é um risco de segurança, mas, neste caso, não acredito que possa ser evitado. Dito isso, não tenho certeza de que você precise criar essa função no SQLCLR. Se você está apenas querendo saber se um login (somente logins do Windows, obviamente) pertence a um grupo específico do Active Directory, há uma função interna que deve fazer isso por você. O IS_MEMBER função indicará se o atual O logon é membro do grupo Windows especificado (especificado como
Domain\Group
). A diferença de como essa função funciona em relação à que você está criando é que ela só funciona para o Login atual; você não pode passar nenhum Login arbitrário para ele. MAS, também não requer nenhum esforço extra e riscos de segurança que fazem parte isto Solução SQLCLR. Então, algo a considerar :-). Comentário de O.P. nesta resposta:
Nesse caso, apenas faça o SQL Dinâmico com duas camadas de profundidade em vez da camada usual. Algo na linha de:
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);
Nesta abordagem, a consulta que executa
OPENQUERY
é SQL dinâmico, mas a consulta dada a OPENQUERY
para executar é um literal de string.