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

[0] Índice de Mensajes

Ir a la versión completa