सबसे अधिक संभावना है कि उन सभी विधानसभाओं को UNSAFE
. पर सेट करने की आवश्यकता होगी , विशेष रूप से तीन System.DirectoryServices* .NET Framework लाइब्रेरी जो आपने आयात की हैं। साथ ही, चूंकि आप असमर्थित .NET Framework लाइब्रेरी
आयात कर रहे हैं। , आपको डेटाबेस को TRUSTWORTHY ON
. पर सेट करना होगा ताकि उन्हें काम पर लाया जा सके। डेटाबेस को TRUSTWORTHY ON
पर सेट करना आम तौर पर ऐसा कुछ है जिससे आप बचना चाहते हैं क्योंकि यह एक सुरक्षा जोखिम है, लेकिन इस मामले में मुझे विश्वास नहीं है कि इसे टाला जा सकता है।
उस ने कहा, मुझे यकीन नहीं है कि आपको इस फ़ंक्शन को SQLCLR में स्वयं बनाने की भी आवश्यकता है। यदि आप केवल यह जानना चाहते हैं कि क्या कोई लॉगिन (केवल विंडोज़ लॉगिन, स्पष्ट रूप से) किसी विशेष सक्रिय निर्देशिका समूह से संबंधित है, तो एक अंतर्निहित कार्य है जो चाहिए यह तुम्हारे लिए करो। IS_MEMBER
फ़ंक्शन इंगित करेगा कि क्या वर्तमान लॉगिन निर्दिष्ट विंडोज समूह का सदस्य है (Domain\Group
. के रूप में निर्दिष्ट) ) आपके द्वारा बनाए जा रहे फ़ंक्शन के विपरीत यह फ़ंक्शन कैसे काम करता है, इसका अंतर यह है कि यह केवल वर्तमान लॉगिन के लिए काम करता है; आप इसमें कोई मनमानी लॉगिन नहीं कर सकते हैं। लेकिन, इसके लिए किसी भी अतिरिक्त प्रयास और सुरक्षा जोखिमों की भी आवश्यकता नहीं है जो इस का हिस्सा हैं। एसक्यूएलसीएलआर समाधान। तो, कुछ विचार करने के लिए :-)।
इस उत्तर पर ओपी की टिप्पणी:
उस स्थिति में, सामान्य एक परत के बजाय डायनेमिक SQL को दो परतों को गहरा बनाएं। की तर्ज पर कुछ:
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);
इस दृष्टिकोण में, क्वेरी निष्पादित हो रही है OPENQUERY
डायनेमिक SQL है, लेकिन क्वेरी OPENQUERY
. को दी गई है निष्पादित करना एक स्ट्रिंग शाब्दिक है।