Het volgende eenvoudige voorbeeld laat zien hoe op basis van een gegevensmodel en relaties een bedrijfslaag gerealiseerd wordt:
Het bedrijfsobject acme_gebruiker_rollen_v is opgebouwd uit drie elementen (bijvoorbeeld vastgelegd met het scherm Views):
•Element 1: acme_gebruiker_rollen, alias grl.
•Element 2: acme_rollen, alias rol, relatie: rol.id=grl.rol_id.
•Element 3: acme_gebruikers, alias gbr, relatie: gbr.id=grl.gbr_id.
Op basis van deze specificatie wordt door Invantive Producer een databaseview geproduceerd vergelijkbaar met de volgende view:
create or replace force view acme_gebruiker_rollen_v
as
/*
* Generated by it_install, version:
* $Header: http://svn.invantive.com/repos/p104/trunk/help/nl/manual/Topics/ip-voorbeeld-bedrijfslaag.xml 19891 2012-10-09 13:23:03Z gle3 $
*/
select grl.id grl_id
, grl.orig_system_reference grl_orig_system_reference
, grl.datum_intrf_geladen grl_datum_intrf_geladen
, grl.datum_intrf_bijgewerkt grl_datum_intrf_bijgewerkt
, rol.id rol_id
, rol.code rol_code
, rol.omschrijving rol_omschrijving
, rol.alle_prjctn_zien_vlag rol_alle_prjctn_zien_vlag
, ...
, gbr.wachtwoord gbr_wachtwoord
, gbr.orig_system_reference gbr_orig_system_reference
, gbr.datum_intrf_geladen gbr_datum_intrf_geladen
from acme_gebruiker_rollen grl
join acme_rollen rol
on rol.id = grl.rol_id
join acme_gebruikers gbr
on gbr.id = grl.gbr_id
Deze view kan eenvoudig gebruikt worden om gegevens in het genormaliseerde gegevensmodel te presenteren als een bedrijfsobject. Het is niet meer nodig dat gebruikers van deze view zelf telkens opnieuw relaties gaan leggen: alle informatie is al beschikbaar als velden in het bedrijfsobject, ook al is de informatie afkomstig uit meerdere tabellen.
Bovendien bevat het resultaat een aantal zogenaamde instead-of triggers. Deze zorgen er voor dat wijzigingen of toevoegingen van gegevens in de view leiden tot de juiste acties op de onderliggende tabellen:
create or replace trigger acme_gebruiker_rollen_ord
instead of delete on acme_gebruiker_rollen_v
for each row
...
begin
--
-- Populate the old and new records...
-- Check the Access Control list for this transaction...
-- Fill-in default values...
-- Call the before-delete user hook if available...
-- Delete from base table...
--
delete
from acme_gebruiker_rollen grl
where 1=1
and grl.id = l_old.grl_id
; ...
--
-- Call the after-delete user hook if available.
--
if acme#gebruiker_rollen.has_after_delete
then
acme#gebruiker_rollen.after_delete(l_old, l_new);
end if;
exception...
end;