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.
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