Nhiều khả năng tất cả các Hội đồng đó sẽ cần được đặt thành UNSAFE
, đặc biệt là ba System.DirectoryServices * Thư viện .NET Framework mà bạn đã nhập. Ngoài ra, vì bạn đang nhập thư viện .NET Framework không được hỗ trợ
, bạn sẽ cần đặt cơ sở dữ liệu thành TRUSTWORTHY ON
để có được họ làm việc. Đặt Cơ sở dữ liệu thành TRUSTWORTHY ON
thường là điều bạn muốn tránh vì nó là một rủi ro bảo mật, nhưng trong trường hợp này, tôi không tin rằng nó có thể tránh được.
Điều đó nói rằng, tôi không chắc rằng bạn thậm chí cần tự tạo chức năng này trong SQLCLR. Nếu bạn chỉ muốn biết liệu Đăng nhập (chỉ Windows Logins, hiển nhiên) có thuộc về một nhóm Active Directory cụ thể hay không, thì có một chức năng tích hợp nên làm điều đó cho bạn. IS_MEMBER
hàm sẽ cho biết liệu hiện tại Đăng nhập là thành viên của nhóm Windows được chỉ định (được chỉ định là Domain\Group
). Sự khác biệt về cách hoạt động của chức năng này trái ngược với chức năng mà bạn đang tạo là nó chỉ hoạt động cho Đăng nhập hiện tại; bạn không thể vượt qua bất kỳ Đăng nhập tùy ý nào vào đó. NHƯNG, nó cũng không đòi hỏi bất kỳ nỗ lực bổ sung nào và rủi ro bảo mật là một phần của điều này Giải pháp SQLCLR. Vì vậy, một cái gì đó cần xem xét :-).
Nhận xét từ O.P. về câu trả lời này:
Trong trường hợp đó, chỉ cần làm cho Dynamic SQL có hai lớp sâu thay vì một lớp thông thường. Vài nét về:
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);
Trong cách tiếp cận này, truy vấn thực thi OPENQUERY
là SQL động, nhưng truy vấn được cung cấp cho OPENQUERY
để thực thi là một chuỗi ký tự.