[ dusty @ 02.03.2009. 17:06 ] @
Pozdrav !

Napravio sam biblioteku koju cu da pozivam iz SQL-ovog CLR-a, medjutim problem je sto moja biblioteka koristi druge, doduse standardne assembly-e i od SQL-a dobijam poruku o gresci da ne moze da nadje taj assembly iako se nalazi u GAC-u. Neko zaobilazno resenje je da stavim da referenca pravi lokalnu kopiju upotrebljenog assembly-a, ali taj assembly referencira neki drugi, takodje standardni, pa treci .... i na kraju ispada da moram da kopiram skoro 50% assembly-a iz Frameworka !

Da li ima nacin da SQL CLR koristi GAC ? Bilo koja druga ideja bila bi rado prihvacena
[ Igor Gajic @ 02.03.2009. 19:05 ] @
Cini mi se da je odgovor ovde:

http://blogs.msdn.com/sqlclr/archive/2006/06/22/643554.aspx
[ dusty @ 03.03.2009. 09:45 ] @
Nemam problema sa Security-em jer sam svoje assembly-e u SQL CLR-u napravio kao unsafe (jer koriste izmedju ostalog Win32 API). Konkretno za jedan assembly mi prijavljuje gresku u vezi Remoting-a:
Citat:
Assembly 'RecipeNotifier' references assembly 'system.runtime.remoting, version=2.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089.', which is not present in the current database. SQL Server attempted to locate and automatically load the referenced assembly from the same location where referring assembly came from, but that operation has failed (reason: 2(error not found)). Please load the referenced assembly into the current database and retry your request.


Znaci CLR pokusava da nadje assembly od Remoting-a u istom folderu gde je moj, umesto da ga trazi u GAC-u. Nisam se puno bavio sa SQL-ovim CLR-om, da li uopste on moze da radi sa assembly-ima koji se ne nalaze u njemu ?
[ mmix @ 03.03.2009. 09:54 ] @
Jesi li registrovao sve asemblije u SQL-u?

[ Igor Gajic @ 03.03.2009. 10:19 ] @
Malo komplikovanije resenje:


http://social.msdn.microsoft.c...9-f077-4043-9f76-a0460c1f9332/
[ mmix @ 03.03.2009. 10:24 ] @
Ma mora da se registruje u SQL serveru :)

evo iz dokumentacije:

Citat:
references is one of the following supported assemblies in SQL Server: Microsoft.Visualbasic.dll, Mscorlib.dll, System.Data.dll, System.dll, System.Xml.dll, Microsoft.Visualc.dll, Custommarshallers.dll, System.Security.dll, System.Web.Services.dll, and System.Data.SqlXml.dll. Other system assemblies can be referenced, but they must be explicitly registered in the database.


Znaci CREATE ASSEMBLY u ruke i sprzi sve reference koje su ti neophodne.
[ dusty @ 15.03.2009. 17:02 ] @
Nisam stigao da se zahvalim, ali evo sada, veliko hvala

Nije moglo drugacije - sto mmix rece zapljunuo sam dlanove i uradio registraciju svih koriscenih assembly-a .... Malo je glupo, ne razumem zasto SQL CLR ne koristi GAC ?!
Nije to toliko zamoran posao koliko komplikuje deployment. Nije problem uzeti windir iz envroment-a da bih napravio pravu putanju do Microsoftovih assembly-a i da pri instalaciji mojih assembly-a odmah registrujem i moje, ali mi se na nekim masinama desava da je transakcioni log prepun. Kao zaobilazno resenje sam koristio preventivno truncate loga pre pocetka registracije, ali mi to ne deluje kao dobro resenje. Prvo, sta ako na nekom serveru previse mali log fajl, drugo sta ako se to DB adminu ne svidi ?



[ mmix @ 16.03.2009. 11:10 ] @
nisam to nikad probao, ali mi je ortak jednom natuknuo da moze umesto putanje do DLL-a da se stavi putanja na xml fajl sa manifestom koji pokazuje na GAC asembli, i onda samo registrujes manifest fajlove koje znas gde su :) Al kazem, nikad nisam probao to.

Nisam bas skapirao povezanost loga i registrovanje asemblija?
[ dusty @ 18.03.2009. 14:59 ] @
Citat:
nisam to nikad probao, ali mi je ortak jednom natuknuo da moze umesto putanje do DLL-a da se stavi putanja na xml fajl sa manifestom koji pokazuje na GAC asembli, i onda samo registrujes manifest fajlove koje znas gde su Al kazem, nikad nisam probao to.


Sounds interesting Cim uhvatim slobodnog vremena istrazicu ovo. Koliko su mi se u pocetku zgadile zabrane koriscenja managed COM objekata u SQL 2005, sada pocinje lagano da mi se dopada SQL CLR, ali jos uvek ne dovoljno

Citat:
Nisam bas skapirao povezanost loga i registrovanje asemblija?


Nisam ni ja Ima nekoliko baza, sve su iste - kopije jedne baze koja je samo distribuirana na vise servera. Provero sam i sve imaju transakcioni log koji ima unrestricted growth, ali na nekim masinama dobijam pri registraciji System.Web assembly-a (i samo pri njemu) gresku da je transakcioni log pun i da nije mogao da nastavi registraciju, dok na drugima prodje bez problema. Koristio sam flaster tehniku (zakrpi da radi i begaj kuci), ali mi ovo nije jasno.
[ mmix @ 18.03.2009. 18:22 ] @
Ok, defintivno ne prihvata xml manifest, upravo sam probao ne prepoznaje format kao PE. Probacu sad i binarni manifest pa cu ti javiti.
[ mmix @ 18.03.2009. 18:57 ] @
Ok, konacno sam povezao loncice da nisi ovo pokrenuo ne bih ovo ni provalio.


Evo sta se desava.

1. Ne moze se registrovati samo preko manifesta, a razlog za to je:
2. SQL CLR uopste ne koristi CLR, ne samo da ne zna da ucita assembly iz GAC-a vec to ni ne pokusava jer:
3. kad registrujes assembly sa CREAT ASSEMBLY SQL ucita DLL i (pazi sad ovo) smesti njegov id u master.sys.assemblies a KOMPLETAN DLL binary (da, ceo fajl) smesti u varbinary polje [content] u tabeli master.sys.assembly_files

Kad mu zatreba instanca tipa iz asemblija SQL CLR instancira asembli i sam tip direktno iz svojih master tabela, verovatno sa Assembly.Load(byte[]), dakle ne ucitava sa diska i ne ucitava iz GAC-a. Sto se njega tice nakon sto registrujes mozes slobodno i da obrises dllove sa diska.


Ovo sad objasnjava i tvoj drugi problem, kad uradis CREATE ASSEMBLY sa velikim asemblijem, isti ide u master-ov transaction log kao deo INSERT INTO sys.assembly_files transakcije.