2011-09-29 17 views
10

Ho letto questo article ma sembra non funzionare per la cancellazione. Ho ottenuto questo errore quando ha cercato di creare un trigger:Come scrivere un trigger per annullare l'eliminazione in MYSQL?

Executing SQL script in server

ERROR: Error 1363: There is no NEW row in on DELETE trigger

CREATE TRIGGER DeviceCatalog_PreventDeletion 
BEFORE DELETE on DeviceCatalog 
FOR EACH ROW 
BEGIN 
    DECLARE dummy INT; 

    IF old.id = 1 or old.id =2 THEN 
     SELECT * FROM DeviceCatalog WHERE DeviceCatalog.id=NEW.id; 
    END IF; 
END; 

SQL script execution finished: statements: 4 succeeded, 1 failed

+0

NEW.fieldname esiste quando si inserisce o si aggiorna un record; quando cancelli niente di nuovo arriva nel database !!! L'errore è chiaro: non è possibile utilizzare NEW.id perché NEW non è consentito in un trigger DELETE – Marco

+1

Secondo l'articolo collegato la scelta della selezione dovrebbe fallire - la tua istruzione select si legge come una vera e non come la 'select into dummy 'dall'articolo destinato a fallire. – miherrma

risposta

17

provare qualcosa di simile -

DELIMITER $$ 

CREATE TRIGGER trigger1 
BEFORE DELETE 
ON table1 
FOR EACH ROW 
BEGIN 
    IF OLD.id = 1 THEN -- Abort when trying to remove this record 
    CALL cannot_delete_error; -- raise an error to prevent deleting from the table 
    END IF; 
END 
$$ 

DELIMITER ; 
+0

Semplice ed esattamente quello che voglio! Grazie molto ! – JatSing

+1

MySQL ha aggiunto il comando SIGNAL per generare errori. Penso che sia stato aggiunto dopo questa risposta. Se qualcuno è interessato: http://dev.mysql.com/doc/refman/5.5/en/signal.html – cgTag

+0

Grande aggiunta @MathewFoscarini, ho appena risposto alla domanda usando la risposta di Devart e il comando SIGNAL che hai suggerito . – mathielo

2

Come dice l'errore: Non v'è alcuna nuova variabile su Elimina.

è possibile utilizzare new.id solo su insert e update. Usa old.id invece.

SELECT * FROM DeviceCatalog WHERE DeviceCatalog.id=old.id; 
6

Ebbene, i messaggi di errore che dice chiaramente: in un trigger DELETE non c'è NUOVO.

  • In un trigger INSERT è possibile accedere ai nuovi valori con NUOVO ..
  • In un trigger UPDATE è possibile accedere ai nuovi valori con NUOVO, quelli vecchi con -. Avete indovinato - OLD.
  • in un trigger DELETE si può acces i vecchi valori con il vecchio ..

E 'semplicemente non ha senso avere NUOVO in un DELETE, proprio come OLD in un INSERT non ha senso.

12

Migliorare @ (accettato) la risposta di Devart con @ il commento di MathewFoscarini su MySQL SIGNAL Command, invece di sollevare un errore chiamando una procedura inesistente si potrebbe segnalare il messaggio di errore personalizzato.

DELIMITER $$ 

CREATE TRIGGER DeviceCatalog_PreventDeletion 
BEFORE DELETE ON DeviceCatalog 
FOR EACH ROW 
BEGIN 

    IF old.id IN (1,2) THEN -- Will only abort deletion for specified IDs 
    SIGNAL SQLSTATE '45000' -- "unhandled user-defined exception" 
     -- Here comes your custom error message that will be returned by MySQL 
     SET MESSAGE_TEXT = 'This record is sacred! You are not allowed to remove it!!'; 
    END IF; 

END 
$$ 

DELIMITER ; 

Il 45000 SQLSTATE è stato scelto come MySQL's Reference Manual suggerisce:

To signal a generic SQLSTATE value, use '45000', which means “unhandled user-defined exception.”

In questo modo il vostro messaggio personalizzato verrà mostrato all'utente ogni volta che si cerca di eliminare i record ID 1 o 2. Inoltre, se nessun record deve essere eliminato dalla tabella, è sufficiente rimuovere le linee IF .. THEN e END IF;. Ciò impedirebbe l'eliminazione dei record ANY sulla tabella.

Problemi correlati