Bases de Datos > Oracle
Echadme una mano con triggers, estoy aprendiendo
(1/1)
manurodri189:
Pues a ver si alguno de vosotros me echa una mano con esto.
Tengo 2 tablas, y se trata de hacer un trigger que si se actualiza una, tenga que hacer un registro en otra, con la hora de modificación, el valor anterior y el nuevo, y poco más.
Pero he hecho el trigger, y me dice errores de compilación, osea que está mal. Me vuelvo loco con esto, y tiene pinta de ser chorrada, pero no doy con la tecla.
Hasta ahora he hecho esto, pero vamos que parece que no funciona el trigger.
--- Código: SQL ---CREATE TABLE Cuenta (nro_cuenta VARCHAR(10),balance INTEGER,PRIMARY KEY(nro_cuenta)); CREATE TABLE Transaccion(nro_cuenta VARCHAR(10),hora_mod DATE,id_cliente VARCHAR(10),ant_balance INTEGER,act_balance INTEGER,PRIMARY KEY(nro_cuenta,hora_mod)); CREATE OR REPLACE TRIGGER actualizarAFTER UPDATE ON CuentaBEGIN INSERT INTO Transaccion (hora_mod, ant_balance, act_balance) VALUES(SYSDATE, OLD.balance, NEW.balance)END actualizar;
Salu2
Thanatos-chan:
que tal
anexo
--- Código: SQL --- CREATE OR REPLACE TRIGGER actualizar AFTER UPDATE ON Cuenta FOR each ROW BEGIN INSERT INTO Transaccion(hora_mod, ant_balance, act_balance) VALUES(SYSDATE,:OLD.balance, :NEW.balance); END actualizar; /
unas cuantas cosas
1-los valores new y old no se pueden usar a nivel de tabla, por lo que el trigger tiene que ser "for each row" a nivel de fila
2-los valores new and old so variables del motor de base de datos de oracle por lo que necesitas referenciarte a ella como variables con el ":"
3-si quieres poner el nombre al final del trigger tienes que incluir el "/" para marcar end of file.
suerte!
manurodri189:
Muchas gracias, ya entendí todo eso, o eso creo :)
Ahora intento lo siguiente:
--- Código: SQL ---CREATE TABLE distancias(ruta VARCHAR(10),distancia_k INTEGER,distancia_m INTEGER,PRIMARY KEY(ruta)); Tabla creada. CREATE OR REPLACE TRIGGER up_kmAFTER UPDATE ON distancias ON distancia_kFOR each ROWBEGINUPDATE transaccion SET distancia_m=:NEW.distancia_k*0.621371;END up_km;/
Este trigger lo que hace es si se actualiza la distancia en km automaticamente lo pone en millas. Pero no se como acceder en esta linea al altributo de la tabla:
--- Código: SQL ---AFTER UPDATE ON distancias ON distancia_k
Se supone que si inserto una nueva fila con km o millas, tiene que actualizar el otro atributo, eso si que no se por donde cogerlo. Muchas gracias.
Salu2
manurodri189:
Bueno, he leido un tutorial que me he bajado muy chulo, y he hecho lo siguiente:
--- Código: SQL ---CREATE OR REPLACE TRIGGER up_kmAFTER UPDATE OF distancia_k, distancia_m ON distancias FOR each ROWBEGINIF UPDATING ('distancia_k') THEN UPDATE distancias SET distancia_m=:NEW.distancia_k*0.621371;ELSIF UPDATING ('distancia_m') THEN UPDATE distancias SET distancia_k=:NEW.distancia_m*1.609344;END IF;END up_km;/
Pero al hacer un set, da problemas de tablas mutantes, ahi si que no tengo ni idea de como solucionarlo.
Salu2
Navegación
Ir a la versión completa