Kemungkinan besar semua Majelis tersebut perlu disetel ke UNSAFE
, terutama tiga System.DirectoryServices* Pustaka .NET Framework yang Anda impor. Selain itu, karena Anda mengimpor library .NET Framework yang tidak didukung
, Anda perlu mengatur database ke TRUSTWORTHY ON
untuk membuat mereka bekerja. Mengatur Database ke TRUSTWORTHY ON
biasanya adalah sesuatu yang ingin Anda hindari karena merupakan risiko keamanan, tetapi dalam kasus ini saya tidak yakin bahwa hal itu dapat dihindari.
Yang mengatakan, saya tidak yakin bahwa Anda bahkan perlu membuat fungsi ini sendiri di SQLCLR. Jika Anda hanya ingin tahu apakah Login (Login Windows saja, tentu saja) milik grup Active Directory tertentu, ada fungsi bawaan yang harus lakukan itu untukmu. IS_MEMBER
fungsi akan menunjukkan jika saat ini Login adalah anggota grup Windows yang ditentukan (ditentukan sebagai Domain\Group
). Perbedaan cara kerja fungsi ini dibandingkan dengan yang Anda buat adalah fungsi ini hanya berfungsi untuk Login saat ini; Anda tidak dapat memasukkan Login sewenang-wenang ke dalamnya. TAPI, itu juga tidak memerlukan upaya ekstra dan risiko keamanan apa pun yang merupakan bagian dari ini solusi SQLCLR. Jadi, sesuatu yang perlu dipertimbangkan :-).
Komentar dari O.P. pada jawaban ini:
Dalam hal ini, buat saja SQL Dinamis dua lapisan dalam, bukan satu lapisan biasa. Sesuatu di sepanjang baris:
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);
Dalam pendekatan ini, kueri mengeksekusi OPENQUERY
adalah SQL Dinamis, tetapi kueri yang diberikan ke OPENQUERY
untuk dieksekusi adalah string literal.