diumenge, 22 d’abril de 2018

Emmascarar noms de taules i camps MDS

En el passat post veiem com migrar models entre entorns o entre versions. Un dany col·lateral de la migració és que els noms de les taules i dels camps que genera automàticament l'MDS. Això ens impacta a l'hora de fer ETLs o altres processos que utilitzin les taules d'MDS. Una solució es crear una vista que emascari aquests noms variables, però aquest procés ha de ser el més automàtic possible per evitar accidents humans.
Avui veurem un procediment per poder crear automàticament les vistes. Aquest procediment utilitzarem les sentències que vam veure en el post: http://www.eljordifabi.tech/2018/03/crear-una-vista-en-una-altra-bbdd.html


alter procedure P_GENERATE_MDS_VIEW (@model varchar(200), @entity varchar(200))
as
begin

    declare @modelName varchar(200)
    declare @entityName varchar(200)
    declare @entityTable varchar(200)
    declare @cv varchar(4000)
    declare @av varchar(4000)
    declare @viewName varchar(200)
    declare @displayName varchar(200)
    declare @col varchar(200)
    declare @seq tinyint

    declare @sentence nvarchar(4000)

    declare cur cursor for
        select
        m.Name as modelName, e.Name as entityNAme, e.EntityTable,
         'create view mds.V_'+replace(replace(replace(upper(m.name),' ', ''),'&',''),'-','')+'_'+replace(replace(replace(upper(e.name),' ', ''),'&',''),'-','')+' as select ' as cv,
         'alter view mds.V_'+replace(replace(replace(upper(m.name),' ', ''),'&',''),'-','')+'_'+replace(replace(replace(upper(e.name),' ', ''),'&',''),'-','')+' as select ' as av,
         'mds.V_'+replace(replace(replace(upper(m.name),' ', ''),'&',''),'-','')+'_'+replace(replace(replace(upper(e.name),' ', ''),'&',''),'-','') as view_name
        from
        mds.mdm.tblModel m
        join mds.[mdm].[tblEntity] e on e.Model_ID=m.ID
        where m.name=@model and e.name=@entity
        order by m.Name, e.Name

    OPEN cur
    -- assignem les variables al cursor
    FETCH cur INTO @modelName, @entityName, @entityTable, @cv, @av,@viewName
    WHILE (@@FETCH_STATUS = 0)
    BEGIN 
        set @sentence =''
        set @seq = 1 
        print @viewName
        IF (NOT EXISTS (SELECT 1 FROM bbdd_mds.sys.views v join bbdd_mds.sys.schemas s on v.schema_id=s.schema_id WHERE s.name+'.'+v.name = @viewName))
            set @sentence= @cv
        else
            set @sentence= @av
        declare cur2 cursor for
            select a.DisplayName, ' '+a.TableColumn+' as '+REPLACE(upper(displayName),' ','') as col
            from mds.mdm.tblModel m
            join mds.[mdm].[tblEntity] e on e.Model_ID=m.ID
            join mds.[mdm].[tblAttribute] a on a.Entity_ID=e.ID
            join (select Model_ID, id from mds.[mdm].[tblModelVersion] where status_id=1) mv on m.id=mv.Model_ID
            where m.Name=@modelName and e.Name=@entityName
            order by a.DisplayName
            OPEN cur2
            FETCH cur2 INTO @displayName, @col
            WHILE (@@FETCH_STATUS = 0)
            BEGIN 
                --print @col
                if @seq=1
                    set @seq=2
                else
                    set @col =', '+@col
                set @sentence= @sentence +@col
                FETCH cur2 INTO @displayName, @col
            end
            close cur2
            deallocate cur2
            set @sentence=@sentence+' from mds.mdm.'+@entityTable
            exec bbdd_mds.sys.sp_executesql @sentence
            --print @sentence
        FETCH cur INTO @modelName, @entityName, @entityTable, @cv, @av,@viewName
    END --final del bucle
    close cur
    deallocate cur
end


Aquest procediment primer recupera el nom del model i l'entitat per crear el nom de la vista i després agafa els noms dels atributs. Així crea la sentencia alter-create de la vista. En cas que la vista existeixi es monta amb l'alter i sinó amb el create. Finalment creem la vist a una bbdd de destí diferent a la d'MDS (exec bbdd_mds.sys.sp_executesql). No és gens recomanable modificar la BBDD d'MDS per no interferir en l'app.
D'aquesta manera els nostres processos podran atacar a la vista i ser independents dels canvis de noms entre entorns.

Cap comentari:

Publica un comentari a l'entrada