2010-02-03 10 views
6

में लोड नहीं होगा हम SQL सर्वर 2005 (32 बिट) की स्थापना में कुछ उपयोगकर्ता परिभाषित कार्यों के साथ एक असेंबली का उपयोग करते हैं। हम इसे इस तरह की एक स्क्रिप्ट के साथ उत्पादन में तैनात करते हैं:सीएलआर असेंबली 64 बिट एसक्यूएल सर्वर 2005

CREATE ASSEMBLY [Ourfunctions] 
AUTHORIZATION [dbo] 
FROM 0x4D5A9000...000 
WITH PERMISSION_SET = SAFE 
GO 
CREATE FUNCTION [dbo].[GLOBAL_FormatString](@input [nvarchar](4000)) 
RETURNS [nvarchar](4000) WITH EXECUTE AS CALLER 
AS 
EXTERNAL NAME [Ourfunctions].[UserDefinedFunctions].[GLOBAL_FormatString] 
GO 

हमने इन कार्यों के साथ कभी भी कोई समस्या नहीं अनुभव की है। अब, जब हमने अपने सर्वरों में से किसी एक को x64 में अपग्रेड करने का प्रयास किया, तो हमें किसी भी फ़ंक्शन को कॉल करते समय त्रुटियां मिलीं। नमूना स्टैक ट्रेस: ​​

System.Data.SqlClient.SqlException: An error occurred in the Microsoft .NET Framework while trying to load assembly id 65549. The server may be running out of resources, or the assembly may not be trusted with PERMISSION_SET = EXTERNAL_ACCESS or UNSAFE. Run the query again, or check documentation to see how to solve the assembly trust issues. For more information about this error: System.IO.FileLoadException: Could not load file or assembly 'ourfunctions, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047) System.IO.FileLoadException: at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean -snip-

त्रुटि का उल्लेख अनुमति सेट EXTERNAL_ACCESS और UNSAFE जबकि हम स्तर SAFE का उपयोग करें।

.dll फ़ाइल लक्ष्य प्लेटफ़ॉर्म के साथ 'किसी भी CPU' पर सेट की गई है और जब हम varbinary वाक्यविन्यास के बजाय फ़ाइल से dll लोड करने का प्रयास करते हैं तो हमें वही परिणाम मिलते हैं। हमने पहले से ही http://support.microsoft.com/kb/918040

में सुझावों का प्रयास किया है हमने 32 बिट मशीन पर सटीक प्रक्रिया की कोशिश की है और सबकुछ अभी काम करता है। यह x86 और x64 के बीच एक अंतर होना चाहिए। कोई विचार?

समाधान: हमें अंततः समाधान मिला। यह पता चला है कि हमारी असेंबली वास्तव में 32 बिट संकलित थी। दृश्य स्टूडियो में, हम लक्ष्य "कोई भी सीपीयू" का इस्तेमाल किया, लेकिन अंतर्निहित .csproj निरीक्षण पर, मैं निम्नलिखित स्निपेट नहीं मिली:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
    ...other elements... 
    <PlatformTarget>x86</PlatformTarget> 
    </PropertyGroup> 

इसलिए हमारे "कोई भी सीपीयू" लक्ष्य वास्तव में एक x86 विधानसभा निर्माण किया गया था! Aaargh। मैंने इस लाइन को उपversण में वापस देखा है, लेकिन यह 2006 में पहले चेकइन में पहले से ही था। शायद यह डेटाबेस प्रोजेक्ट के कुछ शुरुआती टेम्पलेट में एक बग था?

वैसे भी, आपकी मदद के लिए धन्यवाद। मैं रसेल के जवाब को स्वीकार करूंगा, क्योंकि मुझे संदेह है कि बहुत से समस्याओं का अनुभव करने वाले बहुत से लोगों को उनके जवाब से मदद मिलेगी।

उत्तर

0

इस तथ्य के साथ यह नहीं करना है कि यह 64 बिट है, आपको इसे अनुमति देने के लिए डीबी को बदलने की आवश्यकता है। कि अकेले अगर काम नहीं करता है

ALTER DATABASE YOURDATABASEHERE 
SET TRUSTWORTHY ON; 
GO 

, आप इन विकल्पों के साथ-साथ

USE YOURDATABASEHERE 
GO 
sp_configure 'show advanced options', 1; 
GO 
RECONFIGURE; 
GO 
sp_configure 'Ole Automation Procedures', 1; 
GO 
RECONFIGURE; 
GO 
+0

हमने पहले ही ट्रस्टवॉर्टी विकल्प किया है, इसका उल्लेख KB918040 में किया गया है। हम अन्य विकल्पों को एक कोशिश देंगे। जवाब के लिए धन्यवाद। –

0

आप फ़ाइल से विधानसभा लोड करने के लिए कोशिश कर सकते कोशिश कर सकते हैं: इस प्रयास करें। मुझे यकीन नहीं है कि 32 बिट संस्करण पर एनकोडेड स्ट्रिंग वाक्यविन्यास का उपयोग कर 64 बिट SQL सर्वर पर एन्कोडेड असेंबली को तैनात करना संभव है।

+0

हाँ, हमने कोशिश की, लेकिन कोई सफलता नहीं। यह पता चला है कि, एन्कोडेड फॉर्म फ़ाइल रूप के रूप में पोर्टेबल जैसा ही है। हमें मूल कारण मिला। मेरे प्रश्न का उत्तर जोड़ देगा। –

संबंधित मुद्दे