Ecco il problema:Tabella sta mutando, innesco/funzione potrebbe non vederlo (fermare una media scenda sotto 2,5)
creare un trigger che impedisce qualsiasi modifica il rapporto assunzione che avrebbe rilasciare il voto medio complessivo in una particolare classe inferiore a 2.5. Nota: questo trigger non è inteso per indirizzare il GPA medio di un determinato studente, ma piuttosto dovrebbe indirizzare il voto medio per tutti i voti assegnati in una particolare classe.
Ecco lo schema:
Student-schema =(studentnum, name, standing, gpa, major)
Class-schema = (schedulenum, semester, department, classnum, days, time, place, enrollment)
Instructor-schema = (name, department, office)
Teaches-schema = (name, schedulenum, semester)
Taking-schema = (studentnum, schedulenum, semester, grade)
Sto avendo un periodo terribile con questi inneschi, ma qui è il mio tentativo di fare questo lavoro:
CREATE OR REPLACE TRIGGER stopChange
AFTER UPDATE OR INSERT OR DELETE ON taking
REFERENCING OLD AS old
NEW AS new
FOR EACH ROW
DECLARE
grd_avg taking.grade%TYPE;
BEGIN
SELECT AVG(grade)
INTO grd_avg
FROM taking
WHERE studentnum = :new.studentnum
AND schedulenum = :new.schedulenum
AND semester = :new.semester;
IF grd_avg < 2.5 THEN
UPDATE taking
SET grade = :old.grade
WHERE studentnum = :old.studentnum
AND schedulenum = :old.schedulenum
AND semester = :old.semester;
END IF;
END;
/
Sono ovviamente facendo qualcosa di sbagliato, perché quando poi passo ad aggiornare o eliminare una tupla, ottengo l'errore:
ERROR at line 1:
ORA-04091: table TAKING is mutating, trigger/function may not see it
ORA-06512: at "STOPCHANGE", line 6
ORA-04088: error during execution of trigger 'STOPCHANGE'
Qualche consiglio? Sto usando Oracle.
Grazie per la risposta. Ho provato questo, e ottenere lo stesso errore.Mi chiedo se il mio voto medio sia calcolato correttamente e se devo fare qualche istruzione "elsif" per continuare a cambiare l'aggiornamento/inserimento/cancellazione dovrebbe essere superiore a 2,5. Mi sono perso. lol –
Ok, ecco cosa ho dedotto. Non è possibile eseguire una query di selezione all'interno di pl/sql per un trigger quando è possibile modificare la tabella. Mi chiedo se posso riscrivere questo senza usare pl/sql. –
@ TheRationalist. . . Come pratica, avvolgo inserti/aggiornamenti/eliminazioni in procedure memorizzate, piuttosto che fare affidamento sui trigger. Penso che il problema sia il * after * nel trigger (che ho cambiato nella mia mente ma non nel codice apparentemente). Ho anche modificato la logica in modo che funzioni nel caso dell'aggiornamento: potresti ottenere una divisione per 0 in un'eliminazione, quindi la logica effettiva è un po 'più complicata. –