ほとんどの場合、これらのアセンブリはすべて UNSAFE
に設定する必要があります 、特に 3 つの System.DirectoryServices* インポートした .NET Framework ライブラリ。また、サポートされていない .NET Framework ライブラリ
をインポートしているため、 、データベースを TRUSTWORTHY ON
に設定する必要があります それらを機能させるために。データベースを TRUSTWORTHY ON
に設定する 通常、これはセキュリティ リスクであるため避けたいものですが、この場合、回避できるとは思いません。
とはいえ、SQLCLR でこの関数を自分で作成する必要があるかどうかはわかりません。ログイン (明らかに Windows ログインのみ) が特定の Active Directory グループに属しているかどうかを知りたい場合は、すべき組み込み関数があります。 あなたのためにそれをしてください。 IS_MEMBER
関数は現在のかどうかを示します ログインは、指定された Windows グループのメンバーです (Domain\Group
として指定) )。作成中の関数とは対照的に、この関数がどのように機能するかの違いは、現在のログインに対してのみ機能することです。任意のログインを渡すことはできません。しかし、これの一部である余分な労力やセキュリティ リスクも必要ありません。 SQLCLR ソリューション。ですから、考慮すべきことがあります :-)。
この回答に対する O.P. からのコメント:
その場合は、ダイナミック SQL を通常の 1 層ではなく 2 層深くするだけです。次のようなもの:
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; -- DEBUGEXEC (@SQL);コード> プレ>
このアプローチでは、 OPENQUERY
を実行するクエリ 動的 SQL ですが、OPENQUERY
に指定されたクエリは to execute は文字列リテラルです。