Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*INIZIO DESCRIZIONE ED IMPLEMENTAZIONE DI VINCOLI*/
- /*AUTOMAZIONI PK ATTENZIONE: FORSE QUESTA PARTE QUI ANDREBBE NELLA DEFINIZIONE DELLE TABELLE, A PREFERENZA DEL PROF*/
- --TABELLA Relazione
- --Questo trigger, coadiuvandosi con la sequenza, fornisce un'automazione per la Primary Key della tabella Relazione
- --la quale verrà incrementata di una in un'unità per ogni insert
- CREATE OR REPLACE TRIGGER auto_RelazionePK
- BEFORE INSERT ON Relazione
- FOR EACH ROW
- BEGIN
- :NEW.CodRel := relazione_auto_inc.NEXTVAL;
- END;
- /
- --Sequenza affiancata al trigger auto_RelazionePK
- CREATE SEQUENCE relazione_auto_inc INCREMENT BY 1 START WITH 1;
- /
- --TABELLA Attributo
- --Questo trigger, coadiuvandosi con la sequenza, fornisce un'automazione per la Primary Key della tabella Attributo
- --la quale verrà incrementata di una in un'unità per ogni insert
- CREATE OR REPLACE TRIGGER auto_AttributoPK
- BEFORE INSERT ON Attributo
- FOR EACH ROW
- BEGIN
- :NEW.codAtt := attributo_auto_inc.NEXTVAL;
- END;
- /
- --Sequenza affiancata al trigger auto_AttributoPK
- CREATE SEQUENCE attributo_auto_inc INCREMENT BY 1 START WITH 1;
- /
- --TABELLA Class Diagram
- --Questo trigger, coadiuvandosi con la sequenza, fornisce un'automazione per la Primary Key della tabella Class Diagram
- --la quale verrà incrementata di una in un'unità per ogni insert
- CREATE OR REPLACE TRIGGER auto_ClassDiagramPK
- BEFORE INSERT ON Class Diagram
- FOR EACH ROW
- BEGIN
- :NEW.codCD := attributo_auto_inc.NEXTVAL;
- END;
- /
- --Sequenza affiancata al trigger auto_ClassDiagramPK
- CREATE SEQUENCE attributo_auto_inc INCREMENT BY 1 START WITH 1;
- /
- --TABELLA Metodo
- --Questo trigger, coadiuvandosi con la sequenza, fornisce un'automazione per la Primary Key della tabella Metodo
- --la quale verrà incrementata di una in un'unità per ogni insert
- CREATE OR REPLACE TRIGGER auto_MetodoPK
- BEFORE INSERT ON Metodo
- FOR EACH ROW
- BEGIN
- :NEW.codM := metodo_auto_inc.NEXTVAL;
- END;
- /
- --Sequenza affiancata al trigger auto_MetodoPK
- CREATE SEQUENCE metodo_auto_inc INCREMENT BY 1 START WITH 1;
- /
- --TABELLA Parametro
- --Questo trigger, coadiuvandosi con la sequenza, fornisce un'automazione per la Primary Key della tabella Parametro
- --la quale verrà incrementata di una in un'unità per ogni insert
- CREATE OR REPLACE TRIGGER auto_ParametroPK
- BEFORE INSERT ON Parametro
- FOR EACH ROW
- BEGIN
- :NEW.codP:= parametro_auto_inc.NEXTVAL;
- END;
- /
- --Sequenza affiancata al trigger auto_ParametroPK
- CREATE SEQUENCE parametro_auto_inc INCREMENT BY 1 START WITH 1;
- /
- --TABELLA Partecipa
- --Questo trigger, coadiuvandosi con la sequenza, fornisce un'automazione per la Primary Key della tabella Partecipa
- --la quale verrà incrementata di una in un'unità per ogni insert
- CREATE OR REPLACE TRIGGER auto_PartecipaPK
- BEFORE INSERT ON Partecipa
- FOR EACH ROW
- BEGIN
- :NEW.codPartecip:= partecipa_auto_inc.NEXTVAL;
- END;
- /
- --Sequenza affiancata al trigger auto_PartecipaPK
- CREATE SEQUENCE partecipa_auto_inc INCREMENT BY 1 START WITH 1;
- /
- --TABELLA Classe
- --Questo trigger, coadiuvandosi con la sequenza, fornisce un'automazione per la Primary Key della tabella Classe
- --la quale verrà incrementata di una in un'unità per ogni insert
- CREATE OR REPLACE TRIGGER auto_ClassePK
- BEFORE INSERT ON Classe
- FOR EACH ROW
- BEGIN
- :NEW.codClasse:= classe_auto_inc.NEXTVAL;
- END;
- /
- --Sequenza affiancata al trigger auto_ClassePK
- CREATE SEQUENCE classe_auto_inc INCREMENT BY 1 START WITH 1;
- /
- /*FINE AUTOMAZIONI PK*/
- /*INIZIO DEI VINCOLI VERI E PROPRI MEDIANTE TRIGGER E FUNZIONI*/
- --Si è impiegata la seguente vista per alcuni vincoli:
- CREATE OR REPLACE VIEW NomiClassi (CodCD, Nome_Classe) AS
- SELECT CD.codCD, cl.Nome
- FROM Classe cl JOIN ClassDiagram CD ON cl.codCD = CD.codCD;
- --VINCOLO TABELLA PARTECIPA: 'MOLTEPLICITA' CONFORME ALLE REGOLE UML'
- --Questa funzione prende in input un parametro varchar e restituisce 't' (true) se esso è conforme alla scrittura
- --di moltiplicità in un diagramma UML. Infatti la molteplicità deve necessariamente avere una delle seguenti forme:
- --'n..m' (per ogni n>=0, m > 0 e n<m)
- --'*' (dove * è esattamente il carattere *)
- --'n..*' (per ogni n>=0 e * è esattamente il carattere *)
- --'n' (per ogni numero naturale strettamente positivo)
- CREATE OR REPLACE FUNCTION moltepl_valido(mol VARCHAR2) RETURN CHAR IS
- BEGIN
- IF regexp_like(mol, '\d+\.\.\d+$') AND
- TO_NUMBER(regexp_substr(mol,'\d+', 1, 2)) > TO_NUMBER(regexp_substr(mol,'\d+', 1, 1))
- THEN
- RETURN 't';
- ELSIF regexp_like(mol, '^\d+$')
- AND TO_NUMBER(regexp_substr(mol,'\d+')) > 0 THEN
- RETURN 't';
- ELSIF regexp_like(LOWER(mol), '(^\d+)\.\.\*$|^\*$') THEN
- RETURN 't';
- ELSE
- RETURN 'f';
- END IF;
- END;
- /
- --Il seguente trigger fornisce un'implementazione per il vincolo 'Molteplicità conforme ad UML' usufruendo della funzione moltepl_valido appena descritta
- CREATE OR REPLACE TRIGGER dominioMoltepl_Partecipa
- BEFORE INSERT OR UPDATE ON Partecipa
- FOR EACH ROW
- BEGIN
- IF moltepl_valido (:NEW.molteplicità) = 'f' THEN --se la funzione restituisce 'f' (false) vuol dire che...
- RAISE_APPLICATION_ERROR (-20002, 'Scrittura della molteplicità non conforme alle regole UML'); -- ...la stringa non è conforme
- END IF;
- END;
- /
- --VINCOLO TABELLA ATTRIBUTO: IL TIPO DI UN ATTRIBUTO DEVE ESSERE UN TIPO PRIMITIVO OPPURE (XOR) UNA CLASSE DELLO STESSO CLASS DIAGRAM
- --Nota: le query sono tutte commentate e seguono precisamente il flusso solito in cui verrebbe letto prima il from, poi il where ed infine il select
- CREATE OR REPLACE FUNCTION tipoValido (tipo VARCHAR2, cd ClassDiagram.codCD%TYPE) RETURN CHAR IS
- corrispondenze int; --variabile locale che conta il numero di record soddisfacenti la query
- BEGIN
- --verifica se il tipo è primitivo
- SELECT COUNT(*) INTO corrispondenze -- ...ed inserisci il numero di corrispondenze trovate nella variabile locale
- FROM Basictype --Prendi la tabella Basictype contenente i tipi primitivi UML...
- WHERE nome = LOWER (tipo); -- ...selezione i record in cui il tipo passato come parametro è uguale ad uno dei basictypes...
- --se hai trovato almeno una corrispondenza, restituisci vero in quanto il tipo passato come parametro è primitivo
- IF corrispondenze > 0 THEN
- RETURN 't';
- END IF;
- --altrimenti, verifica se il tipo passato come parametro è una classe dello stesso class diagram
- SELECT COUNT(*) INTO corrispondenze -- ...ed inserisci il numero di corrispondenze trovate nella variabile locale
- FROM nomiClassi nCl --Prendi la vista precedentemente costruita chiamata NomiClassi...
- WHERE nCl.nome_classe = tipo AND nCl.codCD = cd; -- ...seleziona i record in cui c'è una corrispondenza tra il tipo passato come parametro ed i nomi delle classi in uno specifico class diagram (quello passato come parametro)...
- --se hai trovato almeno una corrispondenza, restituisci vero in quanto il tipo pur non essendo primitivo, è una classe di un cd
- IF corrispondenze > 0 THEN
- RETURN 't';
- ELSE --altrimenti restituisci falso
- RETURN 'f';
- END IF;
- END; --fine della funzione
- /
- --Il seguente trigger fornisce un'implementazione per il vincolo 'IL TIPO DI UN ATTRIBUTO DEVE ESSERE UN TIPO PRIMITIVO OPPURE (XOR) UNA CLASSE DELLO STESSO CLASS DIAGRAM' usufruendo della funzione tipoValido appena descritta
- CREATE OR REPLACE TRIGGER dominioTipo_Attributo
- BEFORE INSERT OR UPDATE ON Attributo
- FOR EACH ROW
- BEGIN
- DECLARE
- cd ClassDiagram.codCD%TYPE;
- BEGIN
- SELECT cd.codCD INTO cd
- FROM Classe cl JOIN ClassDiagram cd ON cl.codCD = cd.codCD
- WHERE cl.codClasse = :NEW.codCl;
- IF tipoValido (:NEW.Tipo, cd) = 'f' THEN
- RAISE_APPLICATION_ERROR (-20002, 'Tipo non valido');
- END IF;
- END;
- END;
- /
- --VINCOLO TABELLA PARAMETRO: IL TIPO DI UN PARAMETRO DEVE ESSERE UN TIPO PRIMITIVO OPPURE (XOR) UNA CLASSE DELLO STESSO CLASS DIAGRAM
- --Scriviamo direttamente il trigger che utilizzerà la funzione già descritta
- CREATE OR REPLACE TRIGGER dominioTipo_Parametro
- BEFORE INSERT OR UPDATE ON Parametro
- FOR EACH ROW
- BEGIN
- DECLARE
- cd ClassDiagram.codCD%TYPE;
- BEGIN
- SELECT cd.codCD INTO cd
- --metodi e parametri di una classe di uno stesso class diagram
- FROM (Metodo m JOIN classe cl ON m.codCl = cl.CodClasse) JOIN ClassDiagram cd ON cl.codCD = cd.codCD
- WHERE m.codM = :NEW.codMetodo;
- IF tipoValido (:NEW.Tipo, cd) = 'f' THEN
- RAISE_APPLICATION_ERROR (-20002, 'Tipo non valido');
- END IF;
- END;
- END;
- /
- --VINCOLO TABELLA METODO: IL TIPO DI UN METODO DEVE ESSERE UN TIPO PRIMITIVO OPPURE (XOR) UNA CLASSE DELLO STESSO CLASS DIAGRAM
- --Scriviamo direttamente il trigger che utilizzerà la funzione già descritta
- CREATE OR REPLACE TRIGGER dominioTipoOut_Metodo
- BEFORE INSERT OR UPDATE ON Metodo
- FOR EACH ROW
- BEGIN
- DECLARE
- cd ClassDiagram.codCD%TYPE;
- BEGIN
- SELECT cd.codCD INTO cd
- FROM Classe cl JOIN ClassDiagram cd ON cl.codCD = cd.codCD
- WHERE cl.codClasse = :NEW.codCl;
- IF tipoValido (:NEW.Tipo, cd) = 'f' THEN
- RAISE_APPLICATION_ERROR (-20002, 'Tipo non valido');
- END IF;
- END;
- END;
- /
- --VINCOLO TABELLA PARTECIPA: SE IL RUOLO DI UN'ISTANZA DI CLASSE E' 'COMPONENTE', ALLORA LA MOLTEPLICITA' DEVE ESSERE '1'
- CREATE OR REPLACE TRIGGER vincolo_molteplicità_classe_componente
- BEFORE INSERT ON Partecipa
- FOR EACH ROW
- BEGIN
- --se il ruolo è 'compone', la molteplicità deve essere 1
- IF LOWER (:NEW.Ruolo) = 'compone' THEN
- --se si cerca di inserire una molteplicità diversa da 1 in un record il cui ruolo è compone, lancia un errore
- IF :NEW.Molteplicità <> '1' THEN
- RAISE_APPLICATION_ERROR (-20002, 'La molteplicità di una classe componente deve essere 1');
- --altrimenti, imposta in automatico che la molteplicità sia '1'
- ELSE
- :NEW.Molteplicità := '1'; --ricordiamoci che la molteplicità è dichiarata varchar per motivi discussi più su
- END IF;
- END;
- END;
- /
- /*FINE DESCRIZIONE ED IMPLEMENTAZIONE DI VINCOLI*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement