Salve,
ho 2 tabella, TABA(ATTR1, ATTR2) e TABB(ATTR3, ATTR4) con ATTR1 definito come FOREIGN KEY su ATTR3.
Voglio fare in modo che quando il record di TABB viene cancellato, allora deve essere eliminata la tabella TABA.
E' possibile?
Grazie![]()
Salve,
ho 2 tabella, TABA(ATTR1, ATTR2) e TABB(ATTR3, ATTR4) con ATTR1 definito come FOREIGN KEY su ATTR3.
Voglio fare in modo che quando il record di TABB viene cancellato, allora deve essere eliminata la tabella TABA.
E' possibile?
Grazie![]()
Gli uomini, non avendo potuto guarire la morte, la miseria, l'ignoranza, hanno risolto, per vivere felici, di non pensarci.
Sei davvero sicuro di volerlo fare? Non è che puoi ottenere gli stessi risultato riprogettando la struttura del database?
In ogni caso puoi implementare quello che chiedi utilizzando un trigger:
http://dev.mysql.com/doc/refman/5.0/en/triggers.html
Grazie filippo...ma devo proprio farloOriginariamente inviato da filippo.toso
Sei davvero sicuro di volerlo fare?![]()
Ma è possibile capire però, all'interno del trigger, qual è la riga che viene cancellata?
Devo sapere qual è la riga cancellata in quanto essa contiene, in un campo, informazioni sulla tabella da cancellare (una parte del nome, per la precisione)
Grazie![]()
Gli uomini, non avendo potuto guarire la morte, la miseria, l'ignoranza, hanno risolto, per vivere felici, di non pensarci.
Ho trovato...con OLD.campo ottengo il valore di "campo" della riga cancellata
Resta il problema che sono un po' arruginito con la sintassi:
Ecco ciò che voglio fare:
ma mi viene restituito l' errore PLS-00103: Trovato il simbolo DROP...codice:CREATE TRIGGER DROP_TABELLA AFTER DELETE ON MIA_TABELLA FOR EACH ROW DECLARE NOME_TABELLA VARCHAR2(100); NOME_TABELLA_DA_CANCELLARE VARCHAR2(100); BEGIN /* Qui leggo il campo NOME della riga cancellata, e lo converto in upper case */ SELECT UPPER(:OLD.NOME) INTO NOME_TABELLA FROM MIA_TABELLA; /* Qui leggo, tra tutte le tabelle presenti nel database, la tabella il cui nome contenga la stringa in 'NOME_TABELLA' */ SELECT TNAME INTO NOME_TABELLA_DA_CANCELLARE FROM SYS.TAB WHERE TNAME LIKE '%NOME_TABELLA%'; /* Qui cancello la tabella 'NOME_TABELLA_DA_CANCELLARE' */ DROP TABLE 'NOME_TABELLA_DA_CANCELLARE' CASCADE; END;![]()
Ma a parte l'errore, non sono sicuro di come usare le quotazioni degli identificatori![]()
E' possibile un aiuto?
Grazie![]()
Gli uomini, non avendo potuto guarire la morte, la miseria, l'ignoranza, hanno risolto, per vivere felici, di non pensarci.
Sono riuscito a compilare senza errore il seguente trigger:
ma quando cancello una riga da MIA_TABELLA ottengo un messaggio di errore che fa riferimento a:codice:CREATE TRIGGER DROP_TABELLA AFTER DELETE ON MIA_TABELLA FOR EACH ROW DECLARE NOME_TABELLA VARCHAR2(100); NOME_TABELLA_DA_CANCELLARE VARCHAR2(100); BEGIN /* Qui leggo il campo NOME della riga cancellata, e lo converto in upper case */ SELECT UPPER(:OLD.NOME) INTO NOME_TABELLA FROM MIA_TABELLA; /* Qui leggo, tra tutte le tabelle presenti nel database, la tabella il cui nome contenga la stringa in 'NOME_TABELLA' */ SELECT TNAME INTO NOME_TABELLA_DA_CANCELLARE FROM SYS.TAB WHERE TNAME LIKE '%:NOME_TABELLA%'; /* Qui cancello la tabella 'NOME_TABELLA_DA_CANCELLARE' */ EXECUTE IMMEDIATE 'DROP TABLE :NOME_TABELLA_DA_CANCELLARE CASCADE'; END;
ORA-06512: a "DROP_TABELLA", line 6
ORA-04088: errore durante esecuzione del trigger 'DROP_TABELLA'
Come mai?
Grazie![]()
Gli uomini, non avendo potuto guarire la morte, la miseria, l'ignoranza, hanno risolto, per vivere felici, di non pensarci.