• Martes 12 de Noviembre de 2024, 21:21

Autor Tema:  Echadme una mano con triggers, estoy aprendiendo  (Leído 2933 veces)

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Echadme una mano con triggers, estoy aprendiendo
« en: Martes 9 de Marzo de 2010, 18:37 »
0
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
  1. CREATE TABLE Cuenta (nro_cuenta VARCHAR(10),
  2. balance INTEGER,
  3. PRIMARY KEY(nro_cuenta));
  4.  
  5. CREATE TABLE Transaccion(nro_cuenta VARCHAR(10),
  6. hora_mod DATE,
  7. id_cliente VARCHAR(10),
  8. ant_balance INTEGER,
  9. act_balance INTEGER,
  10. PRIMARY KEY(nro_cuenta,hora_mod));
  11.  
  12. CREATE OR REPLACE TRIGGER actualizar
  13. AFTER UPDATE ON Cuenta
  14. BEGIN
  15.     INSERT INTO Transaccion
  16.     (hora_mod, ant_balance, act_balance)
  17.     VALUES(SYSDATE, OLD.balance, NEW.balance)
  18. END actualizar;
  19.  

Salu2



Thanatos-chan

  • Miembro MUY activo
  • ***
  • Mensajes: 136
  • Nacionalidad: do
    • Ver Perfil
Re: Echadme una mano con triggers, estoy aprendiendo
« Respuesta #1 en: Miércoles 10 de Marzo de 2010, 17:54 »
0
que tal

anexo

Código: SQL
  1.  
  2.    CREATE OR REPLACE TRIGGER actualizar
  3.    AFTER UPDATE ON Cuenta FOR each ROW
  4.    BEGIN
  5.        INSERT INTO Transaccion(hora_mod, ant_balance, act_balance) VALUES(SYSDATE,:OLD.balance, :NEW.balance);
  6.   END actualizar;
  7.   /
  8.  
  9.  

 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!
Que es un genio???? yo superare a un genio con trabajo duro, y eso es todo.

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: Echadme una mano con triggers, estoy aprendiendo
« Respuesta #2 en: Lunes 15 de Marzo de 2010, 09:58 »
0
Muchas gracias, ya entendí todo eso, o eso creo :)

Ahora intento lo siguiente:

Código: SQL
  1. CREATE TABLE distancias(ruta VARCHAR(10),
  2. distancia_k INTEGER,
  3. distancia_m INTEGER,
  4. PRIMARY KEY(ruta));
  5.  
  6. Tabla creada.
  7.  
  8.  
  9. CREATE OR REPLACE TRIGGER up_km
  10. AFTER UPDATE ON distancias ON distancia_k
  11. FOR each ROW
  12. BEGIN
  13. UPDATE transaccion SET distancia_m=:NEW.distancia_k*0.621371;
  14. END up_km;
  15. /
  16.  


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
  1. AFTER UPDATE ON distancias ON distancia_k
  2.  

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

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: Echadme una mano con triggers, estoy aprendiendo
« Respuesta #3 en: Lunes 15 de Marzo de 2010, 11:26 »
0
Bueno, he leido un tutorial que me he bajado muy chulo, y he hecho lo siguiente:

Código: SQL
  1. CREATE OR REPLACE TRIGGER up_km
  2. AFTER UPDATE OF distancia_k, distancia_m ON distancias
  3. FOR each ROW
  4. BEGIN
  5. IF UPDATING ('distancia_k') THEN UPDATE distancias SET distancia_m=:NEW.distancia_k*0.621371;
  6. ELSIF UPDATING ('distancia_m') THEN UPDATE distancias SET distancia_k=:NEW.distancia_m*1.609344;
  7. END IF;
  8. END up_km;
  9. /
  10.  

Pero al hacer un set, da problemas de tablas mutantes, ahi si que no tengo ni idea de como solucionarlo.

Salu2