Var olan bir CLR nesnesini çalıştırdığınızda veya derleme oluşturduğunuzda hata oluştu

Bu makale, farklı bir SQL Server örneğinden taşınan bir veritabanındaKI CLR nesneleriyle çalışırken oluşabilecek iki farklı sorunu çözmenize yardımcı olur.

Özgün ürün sürümü: SQL Server
Özgün KB numarası: 918040

Belirtiler

Aşağıdaki senaryoyu inceleyin. SQL Server örneğindeki bir veritabanını ayırır veya yedeklersiniz. SQL Server örneği A Sunucusunda çalışıyor. Daha sonra, bu veritabanını B Sunucusunda çalışan bir SQL Server örneğine ekler veya geri yüklersiniz. Bu senaryoda, aşağıdaki belirtilerle karşılaşabilirsiniz:

  • B Sunucusu'nda bulunan veritabanından external_access veya güvenli olmayan izni ayarlanmış mevcut bir ortak dil çalışma zamanı (CLR) nesnesini çalıştırmayı denediğinizde, aşağıdaki hata iletisini alırsınız:

    Msg 10314, Düzey 16, Durum 11, Satır 2
    Derleme kimliği 65536 yüklenmeye çalışılırken Microsoft .NET Framework bir hata oluştu. Sunucuda kaynaklar tükeniyor olabilir veya derlemeye PERMISSION_SET = EXTERNAL_ACCESS veya UNSAFE ile güvenilmeyebilir. Sorguyu yeniden çalıştırın veya derleme güveni sorunlarının nasıl çözüldüğüne bakmak için belgeleri denetleyin. Bu hata hakkında daha fazla bilgi için:
    System.IO.FileLoadException: 'AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' dosyası veya derlemesi veya bağımlılıklarından biri yüklenemedi. Güvenlikle ilgili bir hata oluştu. (HRESULT özel durumu: 0x8013150A) System.IO.FileLoadException:
    at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, System.Reflection.Assembly.InternalLoad&(String assemblyString, Evidence assemblySecurity, StackCrawl& Mark& stackMark, Boolean forIntrospection) konumundaKi System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) adresinde stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) stackMark, System.Reflection.Assembly.Load(String assemblyString) konumunda boole forIntrospection)

  • Aynı veritabanında veya güvenli olmayan izni ayarlanmış yeni bir derleme external_access oluşturmaya çalıştığınızda aşağıdaki hata iletisini alırsınız:

    Sunucu: Msg 10327, Düzey 14, Durum 1, Satır 1
    'AssemblyName' derlemesi PERMISSION_SET = EXTERNAL_ACCESS için yetkilendirilmediğinden 'AssemblyName' derlemesi için CREATE ASSEMBLY başarısız oldu. Aşağıdakilerden biri doğru olduğunda derleme yetkilendirilmiştir: veritabanı sahibinin (DBO) EXTERNAL ACCESS ASSEMBLY izni vardır ve veritabanında TRUSTWORTHY veritabanı özelliği bulunur; ya da derleme, EXTERNAL ACCESS ASSEMBLY izniyle karşılık gelen oturum açma bilgilerine sahip bir sertifika veya asimetrik anahtarla imzalanır.

Veritabanı özelliğini zaten ON olarak ayarlamış Trustworthy olsanız bile sorunlar oluşur.

Neden

Bu sorun, A Sunucusunda veritabanını oluşturmak için kullandığınız oturum açma bilgilerinin Sunucu B'deki SQL Server örneğinde olmadığından oluşur. Bu oturum açma, Microsoft Windows oturum açma bilgileri veya SQL Server oturum açma bilgileri olabilir.

Geçici Çözüm

Bu sorunu geçici olarak çözmek için aşağıdaki yöntemlerden birini kullanın.

Not

Aşağıdaki yöntemleri kullanmadan önce veritabanı özelliğini etkinleştirdiğinizden Trustworthy emin olun.

  • Veritabanı sahibini sp_changedbownerSa veya Sunucu B'de kullanılabilir bir oturum açma olarak değiştirmek için saklı yordamı kullanın. Örneğin, veritabanı sahibini sa olarak değiştirmek için aşağıdaki deyimi kullanabilirsiniz:

    USE <DatabaseName>
    GO
    
    EXEC sp_changedbowner 'sa'
    

    Not

    Bu deyimde, <DatabaseName> üzerinde çalıştığınız veritabanının adının yer tutucusdur. Değiştirilen veritabanı sahibi belirli bir görevi gerçekleştirmek için ilgili izinlere sahip olmalıdır. Örneğin, veritabanı sahibinin derleme oluşturmak için CREATE ASSEMBLY iznine sahip olması gerekir.

  • A Sunucusu'nda veritabanını oluşturmak için kullanılan SQL Server örneğindeki oturum açma bilgilerini Sunucu B'de SQL Server örneğine ekleyin.

Oturum açma bir etki alanı hesabıysa, B Sunucusunda aynı oturum açma bilgilerini oluşturabilirsiniz. Ardından, Sunucu B'de SQL Server örneğinde oturum açmak için gerekli izinleri verin.

Oturum açma SQL Server bir oturum açma işlemiyse, bu oturum açmanın SID'sinin, Sunucu B'de SQL Server örneğinde oluşturduğunuz yeni SQL Server oturum açma bilgileriyle eşleştiğinden emin olun. Bunu yapmak için deyiminin SID bağımsız değişkenini CREATE LOGIN belirtin.

Daha fazla bilgi

CLR nesnesine farklı bir veritabanından erişiyorsanız ve bu veritabanında DBO SID ile eşleşmeyen bir sorun varsa, aynı sorun oluşabilir.

Daha fazla bilgi için şu blogu ziyaret edin: CSS SQL Server Mühendisleri.

Başvurular