RISOLTO trigger [SQL]

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

sare1234

Utente Attivo
Messaggi
262
Reazioni
3
Punteggio
35
Salve ho tale database in SQL:

SQL:
--Definizione tabella indirizzi
CREATE TABLE indirizzo(
    nomeVia VARCHAR(32),
    numeroCivico VARCHAR(5),
    CAP CHAR(5),
    citta VARCHAR(64),
    provincia CHAR(2),
    codiceIndirizzo SERIAL PRIMARY KEY
);

--Definizione tabella utente
CREATE TABLE utente(
    nome VARCHAR(32),
    cognome VARCHAR(32),
    email VARCHAR(64) PRIMARY KEY,
    password VARCHAR(32),
    numeroTelefono CHAR(10),
    codiceIndirizzo SERIAL NOT NULL,
    CONSTRAINT fk_indirizzo
    FOREIGN KEY (codiceIndirizzo) REFERENCES indirizzo(codiceIndirizzo)
    ON UPDATE CASCADE
    ON DELETE RESTRICT
);
Ho realizzato i seguenti trigger:
SQL:
--Lo stesso indirizzo email non può essere utilizzato da più utenti (rivedere)
CREATE TRIGGER controlloEmail
BEFORE INSERT OR UPDATE ON utente
FOR EACH ROW
EXECUTE PROCEDURE get_controlloEmail();

CREATE OR REPLACE FUNCTION get_controlloEmail()
 RETURNS TRIGGER
 LANGUAGE PLPGSQL
AS
$$
 DECLARE
      TEMP INTEGER :=0;
 BEGIN  
  IF  INSERTING THEN
     SELECT  COUNT (*) INTO TEMP
     FROM  utente U
     WHERE (U.eMail =:NEW.eMail);
     IF(TEMP <> 0) THEN  
     RAISE_APPLICATION_ERROR (-20001,'Indirizzo eMail gia presente!');
     ELSE
     SELECT  NVL(MAX(email) ,0)+1 INTO pk FROM  utente;
     INSERT  INTO  utente (nome, cognome, email, password, numerotelefono, codiceIndirizzo)
     VALUES (pk, :NEW.nome, :NEW.cognome, :NEW.email, :NEW.password, :NEW.numerotelefono, :NEW.codiceIndirizzo);
  END IF
END
$$

--modifica password
CREATE TRIGGER get_fake_update_password
AFTER UPDATE ON utente
FOR EACH ROW
EXECUTE PROCEDURE get_update_password();

CREATE OR REPLACE FUNCTION get_update_password()
 RETURNS TRIGGER
 LANGUAGE PLPGSQL
 AS
$$
  DECLARE
  BEGIN
    IF(new.password != old.password) THEN
    UPDATE utente SET password = pass() WHERE email = new.email;
  END IF;
  RETURN NEW;
END;
$$
Sapete dirmi se vanno bene e quale altro trigger potrei creare?
grazie mille :)
 
Ultima modifica:
Ciao,
innanzitutto occhio che i trigger sono molto pesanti su un database se li usi tanto, non sono da usare cosi alla leggera.
Aggiungerei inoltre che il trigger per controllare se una mail è già presente lo puoi evitare e aggiungere invece un indice univoco su quel campo, in questo modo ci pensa sql a darti errore quando provi ad inserire un indirizzo email già presente ed è anche più performante perchè il campo è indicizzato.
Il trigger sull'update della password è inutile (amenochè pass non faccia qualcosa, che db è, postgre?), ci pensa il motore di database a decidere se cambiare veramente il valore oppure lasciare quello vecchio.
Mi sembra inoltre che le due tabelle alla fin fine siano in una relazione 1 a 1, non sarebbe più comodo mettere il riferimento dell'utente sull'indirizzo in modo tale che un utente ne possa avere più di uno? (magari lavoro, ufficio etc). Fatta cosi tanto vale metterle nella stessa tabella secondo me.
 
Ciao,
innanzitutto occhio che i trigger sono molto pesanti su un database se li usi tanto, non sono da usare cosi alla leggera.
Aggiungerei inoltre che il trigger per controllare se una mail è già presente lo puoi evitare e aggiungere invece un indice univoco su quel campo, in questo modo ci pensa sql a darti errore quando provi ad inserire un indirizzo email già presente ed è anche più performante perchè il campo è indicizzato.
Il trigger sull'update della password è inutile (amenochè pass non faccia qualcosa, che db è, postgre?), ci pensa il motore di database a decidere se cambiare veramente il valore oppure lasciare quello vecchio.
Mi sembra inoltre che le due tabelle alla fin fine siano in una relazione 1 a 1, non sarebbe più comodo mettere il riferimento dell'utente sull'indirizzo in modo tale che un utente ne possa avere più di uno? (magari lavoro, ufficio etc). Fatta cosi tanto vale metterle nella stessa tabella secondo me.

Quoto tutto.

A meno che non sia un esercizio universitario :D A me chiesero di creare un DB con 10 Query (bislacche) e 6 Trigger (inutili).
 
Mi sembra inoltre che le due tabelle alla fin fine siano in una relazione 1 a 1, non sarebbe più comodo mettere il riferimento dell'utente sull'indirizzo in modo tale che un utente ne possa avere più di uno? (magari lavoro, ufficio etc). Fatta cosi tanto vale metterle nella stessa tabella secondo me.
In realtà tutti i residenti della stessa casa hanno lo stesso indirizzo, e un utente può avere più di un indirizzo, quindi in generale non è una corrispondenza unaria. Analogamente un utente può avere più di un numero di telefono. Ma qui si tratta di un compito scolastico, dobbiamo focalizzare sull’uso dei trigger non sulla definizione delle tabelle (che sono solo un esempio)
 
In realtà tutti i residenti della stessa casa hanno lo stesso indirizzo, e un utente può avere più di un indirizzo, quindi in generale non è una corrispondenza unaria. Analogamente un utente può avere più di un numero di telefono. Ma qui si tratta di un compito scolastico, dobbiamo focalizzare sull’uso dei trigger non sulla definizione delle tabelle (che sono solo un esempio)
si vero il fatto del numero di telefono, ma alla fine io ho indicato un solo telefono "nell'applicazione" dalla parte di eclipse e quindi ho rimasto cosi
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top