Data Warehouse Script Generator Doel Op basis van een aantal standaard sql scripts ( create table, create view ) een nieuwe sql script genereren welke alle objecten ( tables & views ) kan aanmaken in een data warehouse.
Dataschema
Uitleg bij het dataschema Een organisatie heeft meerdere companies. In de source database zijn de tabellen gekwalificeerd met een table owner welke de company voorstelt. Bvb. Een organisatie DEVIMO Consult heeft 46 companies onder zich. In de productie database zijn een aantal tabellen gemeenschappelijk voor alle companies, maar zijn heel wat tabellen gescheiden per company. Er is bvb een tabel land welke alle landen bevat, dit is gemeenschappelijk voor alle bedrijven. In SF is deze tabel te benaderen via comm.pays ( table owner is hier comm ) De tabel klanten, echter, is per bedrijf te benaderen en krijgt dus een owner naargelang het bedrijf. Er bestaan dus in de productie database 46 tabellen met klantgegevens. Bvb foko.cli, fowe.cli, devc.cli,. In de data warehouse echter, willen we deze tabellen samenvoegen tot één tabel dbo.dw_customer welke een view is op de productie db en welke alle klanten bevat van alle companies. De view moet dus zodanig gebouwd zijn dat er een Union ontstaat van alle tabellen cli : Create view dbo.dw_customer ( id_customer, id_company, customer_name ) As Select id_cli, foko, name from foko.cli Union all Select id_cli, fowe, name from fowe.cli Union all Select id_cli, devc, name from devc.cli
Voor elk object ( een view of een table) zal de dwh-ontwerper een basisscript maken op één fictieve company SOC_ De basisscript zal tags bevatten welke dan tijdens het genereren van de globale script vervangen dienen te worden door de echte company owner en ook tags welke aangeven dat er een UNION dient te gebeuren op alle companies welke we in de dwh willen stoppen. Deze basisscript zal de ontwerper opslaan op schijf. Via de web applicatie moet dus kunnen : - De organisatie toevoegen wijzigen - verwijderen - De companies per organisatie toevoegen wijzigen verwijderen - De standaard objecten, met hun filename, toevoegen wijzigen verwijderen - Een of meer dwh s toevoegen wijzigen verwijderen - Per dwh : o De companies selecteren welke we in de dwh willen opnemen o De objecten selecteren welke we in de dwh willen opnemen voor de verschillende companies - De uiteindelijke script genereren in een file : in eerste release zullen we de script dan manueel uitvoeren via SQL Management studio ( of php admin query ). We zullen dus niet connecteren aan de doel-database om de script automatisch uit te voeren - De uiteindelijke script moet kunnen her-uitgevoerd worden, dwz dat de view of de table eerst zal moeten gedropt worden.
Home Page
( alternatief homepage : )
Organisations Overzicht met - Organisation.name - Organisation.script_source_path Toevoegen, bekijken, bewerken : Formulier met - Organisation.name - Organisation.script_source_path : een verkenner zou handig zijn om de directory aan te wijzen Verwijderen : Na bevestiging door de gebruiker : delete cascade ( organisation, companies, dwh, dwh_object, dwh_company )
Companies Overzicht met : - Organisation.name - company.name - company.table_owner Toevoegen, bekijken, bewerken : Formulier met - drop down lijst voor selectie van de Organisation.name - company.name - company.table_owner Verwijderen : Na bevestiging door de gebruiker : delete cascade ( company, dwh_company )
Objects Overzicht met : - object.name - object.script_path - object.script_filename Toevoegen, bekijken, bewerken : Formulier met - object.name - object.script_path - object.script_filename - het zou handig zijn om hier een verkenner te kunnen gebruiker om de file op te halen Verwijderen : Na bevestiging door de gebruiker : delete cascade ( object, dwh_object )
DWH Overzicht met : - Organisation.name - Dwh.name - Dwh.target_db_name
Toevoegen, bekijken, bewerken : Formulier met - Drop down lijst om de organisation_name te kiezen - Dwh.name - Dwh.target_db_name - Dwh.target_db_server - Dwh.Target_server_type ( 1 = MS SQL Server, 2 = SyBase, 3 = MySQL ) - Dwh.login - Dwh.password - Dwh.script_destination_path - Dwh.script_detination_filename - Dwh.default_source_db_name - Dwh.default_source_db_server Vervolgens een box met een 2 e formulier om de companies aan te duiden welke in de dwh moeten opgenomen worden dit gaat in de table dwh_company ( cfr accordeon boxes die je kan in/uitklappen ) - Hier worden alle companies van de organisation getoond, met een checkbox of ze al dan niet in de dwh moeten opgenomen worden. De gebruiker kan vervolgens aan of uitvinken Vervolgens een box met een 3 e formulier om de objecten aan te duiden welke in de dwh moeten opgenomen worden dit gaat in de table dwh_object ( cfr accordeon boxes die je kan in/uitklappen ) - Hier worden alle objecten getoond, met een checkbox of ze al dan niet in de dwh moeten opgenomen worden. De gebruiker kan vervolgens aan of uitvinken - Per object wordt ook de source db en source server opgegeven : deze 2 velden zijn default ingevuld met de waarden uit dwh.default_source_db_name en dwh.default_source_db_server Knop Opslaan Knop Opslaan en script genereren zie verder Verwijderen : Na bevestiging door de gebruiker : delete cascade ( dwh, dwh_object, dwh_company )
Genereren van de script Een source script voor één object ziet er als volgt uit : -- Object: View [dbo].[dw_customer] use %target_db% go SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO drop view dbo.dw_customer go create view dbo.dw_customer ( id_customer, customer_name, id_country, customer_city, customer, id_company, customer_litigation_class, follow_up_profile, gl_account, payment_condition, credit_status, credit_limit, name_index1, name_index2 ) as -- %START_UNION% select cli.id_cli, rtrim(rela.rel_nom1)+' '+ isnull ( rela.prenom, '' ), rela.id_pays, rtrim(post.id_pays) + rtrim(post.id_postal) + ' ' + post.lib_commune, rtrim(rela.rel_nom1)+' '+ isnull ( rela.prenom, '' ) + ' - ' + isnull ( rtrim(post.id_pays) + rtrim(post.id_postal) + ' ' + post.lib_commune, '' ) + ' (' + rtrim(cli.id_cli) + ')', 'soc_', isnull(clas_cli.id_clas, 'NC' ), cli.id_t_suivi, str_cptpara.id_cgen, id_cpmt_credit, choix_lib.libelle, limite_credit, substring ( rela.rel_nom1, 1, 1 ), substring ( rela.rel_nom1, 1, 2 ) from [%source_server%].[%source_db%].soc_.cli cli rela.id_var = post.id_variante left outer join [%source_server%].[%source_db%].comm.rela rela on cli.id_rela = rela.id_rela left outer join [%source_server%].[%source_db%].comm.post post on rela.id_pays = post.id_pays and rela.id_post = post.id_postal and left outer join [%source_server%].[%source_db%].soc_.clas_cli clas_cli on clas_cli.id_tclas = 'CONT' and cli.id_cli = clas_cli.id_cli left outer join [%source_server%].[%source_db%].soc_.str_cptpara str_cptpara on cli.id_str_cptpara = str_cptpara.id_str_cptpara left outer join [%source_server%].[%source_db%].comm.choix_lib choix_lib on choix_lib.id_choix = 'T_SOLVAB' and choix_lib.id_lang = (SELECT rela.id_lang FROM [%source_server%].[%source_db%].syst.soc AS soc INNER JOIN [%source_server%].[%source_db%].comm.rela AS rela ON soc.id_rela = rela.id_rela WHERE (soc.id_rela = 'soc_')) and cli.t_solvabilite = choix_lib.valeur -- %END_UNION% GO
Nadat de volgende vervangingen gebeurd zijn : vervang soc_ door target company owner vervang %target_db% door target_db_name vervang %source_db% door source_db_name vervang %source_server% door source_db_server herhaal de statements tussen %START_UNION% and %END_UNION% voor elke company met een UNION ALL, uitgezonderd voor de eerste company create view as select from where union all select from where union all select from where Ziet de script er als volgt uit : In dit voorbeeld : enkel één company met als owner devc
-- Object: View [dbo].[dw_customer] use cds2000_v2_devimo go SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO drop view dbo.dw_customer go create view dbo.dw_customer ( id_customer, customer_name, id_country, customer_city, customer, id_company, customer_litigation_class, follow_up_profile, gl_account, payment_condition, credit_status, credit_limit, name_index1, name_index2 ) as -- %START_UNION% select cli.id_cli, rtrim(rela.rel_nom1)+' '+ isnull ( rela.prenom, '' ), rela.id_pays, rtrim(post.id_pays) + rtrim(post.id_postal) + ' ' + post.lib_commune, rtrim(rela.rel_nom1)+' '+ isnull ( rela.prenom, '' ) + ' - ' + isnull ( rtrim(post.id_pays) + rtrim(post.id_postal) + ' ' + post.lib_commune, '' ) + ' (' + rtrim(cli.id_cli) + ')', 'devc', isnull(clas_cli.id_clas, 'NC' ), cli.id_t_suivi, str_cptpara.id_cgen, id_cpmt_credit, choix_lib.libelle, limite_credit, substring ( rela.rel_nom1, 1, 1 ), substring ( rela.rel_nom1, 1, 2 ) from [win7-franky\sqlexpress].[cds2000_v2_devimo].devc.cli cli left outer join [win7-franky\sqlexpress].[cds2000_v2_devimo].comm.rela rela on cli.id_rela = rela.id_rela left outer join [win7-franky\sqlexpress].[cds2000_v2_devimo].comm.post post on rela.id_pays = post.id_pays and rela.id_post = post.id_postal and rela.id_var = post.id_variante left outer join [win7- franky\sqlexpress].[cds2000_v2_devimo].devc.clas_cli clas_cli on clas_cli.id_tclas = 'CONT' and cli.id_cli = clas_cli.id_cli left outer join [win7- franky\sqlexpress].[cds2000_v2_devimo].devc.str_cptpara str_cptpara on cli.id_str_cptpara = str_cptpara.id_str_cptpara left outer join [win7- franky\sqlexpress].[cds2000_v2_devimo].comm.choix_lib choix_lib on choix_lib.id_choix = 'T_SOLVAB' and choix_lib.id_lang = (SELECT rela.id_lang FROM [win7-franky\sqlexpress].[cds2000_v2_devimo].syst.soc AS soc WHERE INNER JOIN [win7-franky\sqlexpress].[cds2000_v2_devimo].comm.rela AS rela ON soc.id_rela = rela.id_rela (soc.id_rela = 'devc')) and cli.t_solvabilite = choix_lib.valeur -- %END_UNION% GO