SQL: CLR bad przy zaladowaniu CLR

6-sie-2020

Oj oj. Nowe funkcjonalnosci sa tak bardzo zachwalane przez MS. Uzyj tego uzyj tamtego. Problem tylko w tym, ze te nowosci czesto sie ze soba gryza albo z czasem sa modyfikowane lub wycofywane (!)

CLR na SQL ma rzeczywiscie szerokie mozliwosci, bo pozwla na korzystanie ze wszelkich funkcji .NET z poziomu SQL. Konfiguracja CLR juz od samego poczatku skladala sie z kilku krokow, a od wersji 2017 zostala jeszcze zmieniona. Tutaj nie znajdziesz pelnego opisu jak konfigurowac CLR, ale wylacznie opis jednego bledu I rozwiazania.

SQL 2016. Baza ma ustawiony parameter TRUSTWORTHY, a jej wlascicielem jest konto XXXX (login domenowy). Do bazy zostal zaladowany CLR z PERMISSION SET UNSAFE. Podczas korzystania z funkcji pojawia sie blad:
Msg 10314, Level 16, State 11, Line 113
An error occurred in the Microsoft .NET Framework while trying to load assembly id 65538. 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 'xxxxxxxxx, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null’ or one of its dependencies. An error relating to security occurred. (Exception from HRESULT: 0x8013150A)
System.IO.FileLoadException:
   at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection)
   at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
   at System.Reflection.Assembly.Load(String assemblyString)

Najwazniejsza czesc to An error relating to security occurred. Co ciekawe ten sam assembly zaladowany do innej bazy, ktrej wlascicielem jest sa – dziala! Chwila refleksji I czytania dokumentacji pozwolila ustalic, ze to wlasciciel bazy danych musi miec odpowiednie uprawnienie:

use [master]
GO
GRANT UNSAFE ASSEMBLY TO [DOMAIN\LOGIN] 
GO

U mnie dziala, ale warto pamietac, ze w nowszych systemach assembly nalezy podpisywac, a do certyfikatu tworzyc stowarzyszony login, ale to zdecydowanie cos na dluzszy artykul…

Komentarze są wyłączone

Autor: Rafał Kraik