Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [mySQL] - Simulare check assertion per controlli sul database

    Ciao a tutti!!
    Volevo chiedervi se in mySQL c'è qualcosa di simile alla check assertion usata nello standard sql.
    Ad esempio, poniamo che voglio controllare che il campo X della tabella T1 sia strettamente uguale al conteggio delle tuple della tabella T2. Ciò, evidentemente, è indipendente da un evento temporale e da una tabella/attributo in particolare (e quindi non può essere associato a un trigger), ma comunque è un controllo che andrebbe fatto regolarmente sul database.
    Come si può fare quindi?

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    136
    ciao,
    in mysql la clausola check non è implementata.Io penso inoltre che i trigger siano sempre utili e forse anche per il tuo problema.Se ho capito bene il campo X di T1 conta i record su T2.Questo vuol dire che ogni volta che inserisco un record in T2,X di T1 deve essere incrementato.

    create trigger Incrementa after insert on T2
    for each row......
    in questo modo hai sempre un allineamento dei dati nelle due tabelle.

    Spero di aver capito bene,in caso contrario dammi maggiori info.Saluti.

  3. #3
    Originariamente inviato da and77
    ciao,
    in mysql la clausola check non è implementata.Io penso inoltre che i trigger siano sempre utili e forse anche per il tuo problema.Se ho capito bene il campo X di T1 conta i record su T2.Questo vuol dire che ogni volta che inserisco un record in T2,X di T1 deve essere incrementato.

    create trigger Incrementa after insert on T2
    for each row......
    in questo modo hai sempre un allineamento dei dati nelle due tabelle.

    Spero di aver capito bene,in caso contrario dammi maggiori info.Saluti.
    Ora vado a memoria non avendo il progetto sotto mano.
    Il mio progetto è qualcosa di simile a Groupon.
    Poniamo che ho 2 tabelle Offerta(ID, ..., QuantitàCouponInVendita)
    e Acquisto (idAcquirente, idOfferta, numeroCouponAcquistati)
    Quello che voglio controllare è che nella tabella Acquisto, per ogni ID offerta, la somma di numeroCouponAcquistati sia identica a QuantitàCouponInVendita sullo stesso codice offerta.

    Per esempio ho in offerta
    (1111, ..., 4)

    e in acquisto
    (001, 1111, 2)
    (002, 1111, 1)
    (003, 1111, 1)

    In questo caso la clausola check sarebbe soddisfatta, perchè la somma (2+1+1) è proprio uguale a 4. Spero di essere stato più chiaro

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    136
    Ecco la mia soluzione:

    codice:
    create trigger CheckCouponAcquistati BEFORE INSERT into Acquisto
    BEGIN
    declare NroCouponAcquistati integer default 0;
    declare NroCouponInvendita integer default 0;
    Declare couponOverflow condition for sqlstate '45000';
    
    select sum(numeroAcquistiCoupon) into NroCouponAcquistati
    from Acquisto
    where idOfferta=new.IdOfferta;
    
    select NumeroCouponInVendita into NroCouponVendita
    from Offerta
    where Id=new.IdOfferta;
    
    if NroCouponAcquistati > NroCouponInVendita then
    signal couponOverflow Set Text_Message='non è possibile accettare l'ordine:Coupon esauriti';
    end if;
    
    END;
    Spero vada bene.Saluti.

  5. #5
    Originariamente inviato da and77

    Spero vada bene.Saluti.
    Ciao, innanzitutto grazie per la risposta, davvero molto gentile
    Comunque avevo già implementato una cosa del genere; un trigger che al momento della richiesta di un coupon verifica se ci sono coupon disponibili e se ce ne sono sottrae i coupon richiesti a quelli disponibili, altrimenti segnala un errore.

    E' presente anche un altro trigger che nel momento in cui il numero di coupon viene raggiunto, crea automaticamente tutta la lista di acquirenti inserendola in un'altra tabella.

    Tuttavia, visto che ho riempito la base di dati prima di inserire i trigger e che comunque degli errori possono sempre capitare, vorrei fare in modo che venga anche controllato lo stato della base di dati, ovvero che tutte le condizioni siano verificate.

    Forse ci sarebbe bisogno di far girare costantemente una funzione in background per il controllo?

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    136
    Non c'è bisogno.I trigger si attivano al momento in cui una condizione si verifica e attivano una azione.Il problema è che bisognerebbe vedere prima di tutto quale sono queste condizioni e su quali tabelle agiscono.Per esempio,se non mi sbaglio, in mysql non ci possono essere più trigger sulla stessa tablella con lo stesso tempo di attivazione.


    Comunque avevo già implementato una cosa del genere; un trigger che al momento della richiesta di un coupon verifica se ci sono coupon disponibili e se ce ne sono sottrae i coupon richiesti a quelli disponibili, altrimenti segnala un errore.
    Perchè?non penso che ci sia bisogno di sottrarre.Nel momento in cui le due quantità sono uguali o una maggiore dell'altra l'inserimento viene impedito a meno che non lo richiede la logica dell'applicazione.

    Come puoi ben vedere se non si ha una visuale completa del problema non è possibile dare delle risposte precise.Ad ogni modo spero di esserti stato utile.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.