In questi giorni nel tempo libero sto terminando le procedure di esportazione dei dati da DotNetNuke in modo da poter migrare tutto sul nuovo CMS che a breve verrà utilizzato per il sito di UGISS.
Ultimamente mi sono scontrato con una tabella che ormai pensavo di vedere solo nei miei più remoti incubi (oppure su AS400 :-D)....una tabella fatta di praticamente solo due colonne:
PropertyNames, PropertyValuesString
I più attenti di voi gia avranno capito che sto parlando della tabella aspnet_Profile, presente nel database a supporto di ASP.NET per la gestione delle informazioni sui profili.
Una tabella peggiore era davvero difficile da immaginare. In questa tabella c'è una riga per ogni utente ed i dati del profile dell'utente (ad esempio, Nome, Cognome, Indirizzo,ecc ecc) sono memorizzati in PropertyValuesString cosi:
60it-ITMilanoDavide20100MauriItalyMilano
per sapere come decodificare questa accozzaglia senza significato di informazioni, è necessario utilizzare il valore contenuto in PropertyNames:
Website:S:0:0:TimeZone:S:0:2:PreferredLocale:S:2:5:Region:[.......]
con il risultato che una semplice query di ricerca tipo "estrazione di tutti i nome e cognomi e cap" è semplicemente impossibile....o, per meglio dire, è possibile solamente con grossi sforzi.
Ovviamente anche fatti gli sforzi necessari non è certo possibile pensare di avere prestazioni buone da una query che per ogni riga deve decodificare tutti i valori delle proprietà.....
Ora, dico io, mi sta bene che sia necessario avere un sistema per memorizzare un quantità arbitraria e non conoscibili a priori di dati...ma proprio questa struttura oscena dovevano usare?!?!?!? XML pareva brutto?
Cmq, per chi di voi si trovasse nella medesima necessità di estrarre informazioni da questo "database" può scaricare la soluzione "AspNetPropertyExtractor" da qui
http://community.ugiss.org/files/folders/files/entry848.aspx
e che contiene le classi necessarie per creare due UDF managed (meno male che in SQL Server 2005 c'è il supporto per .NET!!!) che permettono di gestire in modo più semplice l'estrazione dei dati dai profili ASP.NET:
select * from dbo.GetProperties('Website:S:0:0:TimeZone:S:0:2:[.......]', '60it-ITMilanoDavide20100MauriItalyMilano')
go
select
dbo.GetPropertyValue('FirstName', PropertyNames, PropertyValuesString),
dbo.GetPropertyValue('LastName', PropertyNames, PropertyValuesString)
from
UgissDnnProd.dbo.aspnet_Profile where UserId = [....]
go
A titolo informativo: ho sviluppato la soluzione in qualche ora di lavoro...diciamo 2. Se il database fosse stato normalizzato correttamente avrei risparmiato due buone ore di lavoro per fare una delle query più semplice e stupide del pianeta....
Meditate gente, meditate.