dimecres, 8 de juny de 2016

ADEU-BIML: SQL Server (I)

En el darrer post sobre BIML (http://www.eljordifabi.tech/2016/05/adeu-biml.html) havíem acabat veient l'esquema BIML per generar els dtsx per a la generació de metadata dels orígens de dades. Aquesta metadata ens permetrà posteriorment crear els dtsx que ens extreguin les dades automàticament cap a la nostra Staging Area.
Avui començarem a analitzar com fer aquests passos tenint com a origen una base de dades en SQL Server.
L'esquema de metadata ampliat és el següent:

S'ha afegit com a subclasse de Source, source_database que és on guardarem la connection string. Source_database_table com a subclasse de source_detail. I 2 taules on guardarem els índex amb les seves columnes. Aquestes taules ens permetran saber quina és la clau primària de cadascuna de les taules per poder fer càrregues incrementals.

Per a cada origen de dades tindrem 4 paquets biml principals que aniran invocant a altres biml que es comportaran de manera diferent segons el tipus d'origen de dades.
  1.  000_GenerateMetadataParent.biml : per obtenir les metadates de l'origen
  2. 001_CreateTablesStagParent.biml : per generar els scripts per crear les taules a l'staging area
  3. 002_DropTablesStagParent.biml : per generar els scripts per esborrar les taules a l'staging area
  4. 004_LoadDataParent.biml : per generar els dtsx per carregar les dades des dels orígens a l'staging area.
 I excepcipnalment per BBDD en tindrem un cinquè: 003_CreateIndexStagParent.biml :per generar els scrips per crear els índex a les taules de l'staging area
Anem a pel codi. Implementarem el fitxer: 000_GenerateMetadataParent.biml

 Començarem explicant les parts comunes. De moment deixarem a banda les funcions UT_SQLServer_datatype.cs que ja l'explicarem quan el necessitem.

UT_getProject.biml

<# String _project = "ADVENTURE PROJECT"; #>
Aquest biml només té el nom del projecte.

 UT_connections.biml

 Aquest biml té com a objectiu recuperar les cadenes de connexió de l'staging area i del datawarehouse i posar-les en variables que podrem fer servir més tard.

UT_generateConnections.biml

 Aquí crearem les connexions del dtsx. A través de la consulta:
<#
string _sources_sql = "select s.source_id, s.source_name, t.source_type_name, s.hasParameter "+
       "from biml.source s "+
        "join biml.project p on p.project_id=s.project_id "+
        "join biml.source_type t on s.source_type=t.id_source_type "+
        "where project_name='"+_project+
        " order by source_id";
#>


Obtindrem les nostres fonts de dades i per cada una d'elles,segons el tipus (ara només SQL Server) crearem la connexió.
Podeu trobar el codi a: https://github.com/jordiisidro/adeu-biml/blob/master/UT_generateConnections.biml

En aquest punt també crearem la connexió a l'staging area. Biml és suficientment intel·ligent per que si una connexió no es fa servir dins el dtsx no la crei, encara que la definim aquí.

UT_paramExpression.biml

Aquest biml té el codi de definició dels paràmetres de projecte si és que es volen definir. Els paràmetres tindran el mateix nom que el que hem donat quan hem definit l'origen de dades- 
<# if (_param) { #>
    <Expressions>
        <Expression ExternalProperty="ConnectionString">@[$Project::<#= _table["source_name"] #>]</Expression>
    </Expressions>
<# } #>




UT_generateParameters.biml

Aquest biml definirà els paràmetres necessaris per als nostres orígens de dades i els packages que hi haurà dins del projecte. Per que biml reconegui un paràmetre s'ha de definir dins dels tags <Project><PackageProject><Parameters> i dins de <PackageProject> s'han d'enumerar els <Packages>

En el cas d'origen BBDD hem decidit crear un package per cada taula que volguem carregar. Per una banda ens generarà molts packages, però per l'altra seran més ràpids d'obrir que si en tenim un de sol amb totes les taules.
De moment amb la generació de metadata no ens afecta, només tindrem un dtsx per origen de dades.

UT_generatePackages.biml

  Aquest biml crearà el package principal que s'encarregarà d'invocar cada un dels subpackages per origen de dades.

UT_generateSubpackages.biml

Finalment aquí hi ha la lògica! Ja tocava.... Tot el que hem fet fins ara era per preparar la generació de paquets. Ara anem a construir.
<# if (_packageName =="GenerateMetadata"){ #> <#@ include file="GenerateMetadataDatabase.biml" #> <# } #>

 Per cada tipus d'origen de dades tindrem el nostre GenerateMetadata*.biml

Anem a veure que hi ha a dins del GenerateMetadataDatabase.biml

GenerateMetadataDatabase.biml

https://github.com/jordiisidro/adeu-biml/blob/master/GenerateMetadataDatabase.biml 
El que fa és atacar a les DMV de SQL Server per extreure la metadata.
L'ordre dels passos és:
  1. Esborrar les columnes dels índex
  2. Esborrar els índex
  3. Esborrar les columnes
  4. Esborrar les taules
  5. Carregar les taules
  6. Carregar les columnes
  7. Carregar els índex
  8. Carregar les columnes dels índex
  9. Actualitzar les PK a partir dels índex.
Al codi teniu com accedir a la metadata a través de les DMV.
Si generem el codi d'aquest conjunt de bimls (generant el de  000_GenerateMetadataParent.biml n'hi ha prou) ens crearà el dtsx per omplir la metadata dels nostres orígens de dades SQL Server.
Si executem el dtsx resultant ens omplirà les taules del nostre esquema. 

Totes ? En aquest cas sí, però no tots els atributs. N'hi ha alguns que s'han d'omplir manualment per que impliquen lògica de negoci.
En el cas de BBDD el camp is_pk només es generarà automàticament en cas que tinguem els índex clustered unique a l'origen, i el camp incremental_date_field l'haurem d'indicar manualment.
També haurem d'indicar per cada taula si volem que la càrrega sigui sencera o incremental (o el que vulguem definir en un futur). 


Això és tot en quant a la generació de metadata per una bbdd SQL Server.
Teniu tot aquest codi i alguna cosa més a:  https://github.com/jordiisidro/adeu-biml 

En els propers posts explicarem com generar els scripts de creació i esborrat de taules a l'staging area i, finalment, el que de veritat ens interessa, carregar les dades.
 

Cap comentari:

Publica un comentari