S největší pravděpodobností budou muset být všechny tyto sestavy nastaveny na UNSAFE
, zejména tři System.DirectoryServices* .NET Framework knihovny, které jste importovali. Vzhledem k tomu, že importujete nepodporované knihovny .NET Framework
, budete muset databázi nastavit na TRUSTWORTHY ON
aby je dostali do práce. Nastavení databáze na TRUSTWORTHY ON
je obvykle něco, čemu se chcete vyhnout, protože jde o bezpečnostní riziko, ale v tomto případě si nemyslím, že se tomu dá vyhnout.
To znamená, že si nejsem jistý, zda vůbec potřebujete tuto funkci vytvořit sami v SQLCLR. Pokud jen chcete vědět, zda Přihlášení (samozřejmě pouze přihlášení Windows) patří do určité skupiny Active Directory, existuje vestavěná funkce, která by měla udělej to pro tebe. IS_MEMBER
funkce ukáže, zda je aktuální Login je členem zadané skupiny Windows (určené jako Domain\Group
). Rozdíl v tom, jak tato funkce funguje oproti té, kterou vytváříte, spočívá v tom, že funguje pouze pro aktuální přihlášení; nemůžete do něj vložit libovolné přihlášení. ALE také to nevyžaduje žádné další úsilí a bezpečnostní rizika, která jsou součástí tohoto řešení SQLCLR. Takže něco ke zvážení :-).
Komentář od O.P. k této odpovědi:
V takovém případě stačí vytvořit z dynamického SQL dvě vrstvy hluboké místo obvyklé jedné vrstvy. Něco ve smyslu:
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);
V tomto přístupu je dotaz spouštějící OPENQUERY
je dynamický SQL, ale dotaz zadaný OPENQUERY
spustit je řetězcový literál.