RISOLTO trigger [SQL]

Stato
Discussione chiusa ad ulteriori risposte.

sare1234

Utente Attivo
262
3
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:

NicoZ96

Utente Attivo
1,039
118
CPU
i5 9600 K
Dissipatore
Be Quiet! Dark Rock Pro 4
Scheda Madre
Msi Z390 Gaming Plus
HDD
Seagate Barracuda 1Tb x2, SSD Samsung 640EVO 120Gb, SSD Kingstone 120Gb, SSD Samsung 860EVO 500Gb
RAM
DDR4 2x8Gb 3000MhZ Corsair Vengeance
GPU
MSI RTX 2080 Gaming X Trio
Audio
Creative Sound Blaster Z
Monitor
Samsung C24FG70 144Hz FHD
PSU
Cooler Master v650 Semi Modular
Case
Cooler Master Haf XM
Periferiche
Razer Deathadder Elite, Corsair K95 RGB Platinum, Logitech G27, Controller Xbox 360(PC), Razer Wildcat
OS
Windows 10
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.
 

Tidus88

From another world
Utente Èlite
2,038
1,738
CPU
Ryzen 5600X
Dissipatore
Deepcool GAMMAX 400
Scheda Madre
Asus Prime B450-Plus
HDD
MX-500 500GB
RAM
Ballistix 16GB DDR4 3000Mhz
GPU
RTX 3060Ti Dual ASUS
Audio
Edifier R1280db
Monitor
Hisense H55U7A
PSU
Sharkoon Silentstorm Icewind 550W
Case
Corsair 275R Airflow White
Net
SkyWifi FTTH
OS
Windows 10
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).
 

Andretti60

Utente Èlite
6,440
5,091
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)
 
  • Mi piace
Reazioni: Moffetta88

sare1234

Utente Attivo
262
3
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.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili