Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

NOVATO: Problema con Triggers ¿como hacerlo?

Estas en el tema de NOVATO: Problema con Triggers ¿como hacerlo? en el foro de Oracle en Foros del Web. Hola a todos, Por necesidades impuestas en el trabajo, he de realizar una migración de los datos existentes en diversas tablas de Access a Oracle, ...
  #1 (permalink)  
Antiguo 03/07/2008, 02:34
Avatar de popobcn
Moderador
 
Fecha de Ingreso: noviembre-2006
Ubicación: Cerdanyola del Vallès
Mensajes: 3.892
Antigüedad: 17 años, 4 meses
Puntos: 1142
Pregunta NOVATO: Problema con Triggers ¿como hacerlo?

Hola a todos,

Por necesidades impuestas en el trabajo, he de realizar una migración de los datos existentes en diversas tablas de Access a Oracle, manteniendo el soporte de las páginas html de acceso a datos para el impacto sobre los usuarios sea el minimo.

Dentro de ORACLE he logrado importar los datos desde TOAD sin ningún problema, he creado las secuencias necesarias para que los valores ID de las tablas se consecutivo, pero me encuentro con un problema GRAVE, ya que desde las páginas HTML de acceso a datos de Access no puedo controlar ni traspasar el valor ID a la base de datos ORACLE (Realizo la conexión vinculando las tablas mediante ODBC y Access).

Mirando en profundidad las posibilidades, creo que he descubierto que una posible solución es añadir un TRIGGER que controle antes de realizar la INSERCION de los datos en la bd con el fin de que realize una consulta sobre la tabla en oracle, capture el último valor ID introducido y lo traspase directamente al INSERT de la nueva entrada.... Pero....

¿ESTO ES POSIBLE?
¿COMO LO HAGO?

La verdad es que NO tengo ni IDEA de ORACLE y comienza a imperar las prisas para que este todo listo... Y no se donde recurrir para ver un poco de luz...

Os agradeceria que me comentaraís que he de realizar para conseguir salir del paso...

Saludos y gracias anticipadas!
  #2 (permalink)  
Antiguo 03/07/2008, 08:56
 
Fecha de Ingreso: junio-2008
Ubicación: D.F.
Mensajes: 62
Antigüedad: 15 años, 9 meses
Puntos: 1
Respuesta: NOVATO: Problema con Triggers ¿como hacerlo?

Que Tal,

De hecho si puedes usar un trigger para hacer lo que necesitas.


CREATE OR REPLACE TRIGGER NOMBRE_TRIGGER BEFORE INSERT ON NOMBRE_TABLA
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
vvMaxim NUMBER(10);
BEGIN

SELECT nombre_seq.NEXTVAL
INTO :NEW.id
FROM dual;

END;
/

Espero te sea de Utilidad.
  #3 (permalink)  
Antiguo 03/07/2008, 21:31
Avatar de kikolice  
Fecha de Ingreso: marzo-2004
Mensajes: 1.510
Antigüedad: 20 años
Puntos: 7
Respuesta: NOVATO: Problema con Triggers ¿como hacerlo?

nada mas abria que decir que

vvMaxim NUMBER(10);

sale sobrando
__________________
Blogzote.com :-) Mi blog
  #4 (permalink)  
Antiguo 08/07/2008, 07:56
Avatar de popobcn
Moderador
 
Fecha de Ingreso: noviembre-2006
Ubicación: Cerdanyola del Vallès
Mensajes: 3.892
Antigüedad: 17 años, 4 meses
Puntos: 1142
Respuesta: NOVATO: Problema con Triggers ¿como hacerlo?

Hola!!!

Antetodo muchas gracias por vuestras respuestas... pero creo que me estoy perdiendome un poco... A ver si termino de ver la luz :)

Cita:
SELECT nombre_seq.NEXTVAL
INTO :NEW.id
FROM dual;
No termino de comprender esta parte en concreto:

INTO :NEW.flipi

1. NEW es la variable que definimos inicialmente en el TRIGGER ¿no?
2. .ID corresponde a la columna en la que deseo traspasar el valor de la secuencia?

He intentado adaptar el código y ha quedado tal que así:

Cita:
CREATE OR REPLACE TRIGGER USER.ACTUA_IDS2
BEFORE INSERT
ON USER.TEMAS
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE
vvMaxim NUMBER(10);

BEGIN
SELECT TEMAS_SEC.NEXTVAL
INTO :NEW.flipi
FROM DUAL;

END ;
/
Obviamente, FLIPI es el nombre del campo ID que le he dado en Oracle .oO(Uno ya esta algo ciego de mirar el TOAD intentando hacer que funcione esto como para poner nombres coherentes jajajajajajajjaja).

Al compilar el TRIGGER me lanza los siguientes mensajes de error:

Cita:
6/10 PLS-00201: el identificador 'FLIPI' se debe declarar
7/5 PL/SQL: ORA-00904: : identificador no válido
5/5 PL/SQL: SQL Statement ignored
Paralalemente, he logrado que "funcione" a "MEDIAS" el invento, ya que al realizar la actualización de los registros después de la inserción, siempre queda el último registro con un valor nulo en el campo ID... Por lo que no me termina de servir el tema... Este es el código que estoy empleando actualmente:
Cita:
CREATE OR REPLACE TRIGGER ACTU_IDS
BEFORE INSERT
ON TEMAS
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE
hijodeputa NUMBER;

BEGIN
SELECT TEMAS_SEC.NEXTVAL
INTO hijodeputa
FROM DUAL; ---TEMAS;

UPDATE TEMAS
SET flipi = hijodeputa
WHERE flipi is null;

END ;
/
Gracias por vuestra ayuda!

Saludos

PD.: Disculpad el nombre de las variables... pero creo que estoy perdiendo ya la poca razón que me quedaba aisssss
  #5 (permalink)  
Antiguo 08/07/2008, 08:56
 
Fecha de Ingreso: junio-2008
Ubicación: D.F.
Mensajes: 62
Antigüedad: 15 años, 9 meses
Puntos: 1
Respuesta: NOVATO: Problema con Triggers ¿como hacerlo?

Que Tal,

Así es id es la columna que obtendrá el valor de la secuencia en tu tabla TEMAS,
NEW hace referencia al nuevo valor que obtendrá ese campo. ya que en el insert podrias ponerle al id un valor. ese valor lo podrías obtener con OLD.ID.

TE ENVIÓ EL SIGUIENTE SCRIPT PARA QUE PUEDAS EJECUTARLO Y VER LO QUE SUCEDE CUANDO INSERTAS ANTES DE CREAR EL TRIGGER Y DESPUÉS DE CREARLO.

DROP TABLE TEST_SECUEN
/

DROP SEQUENCE SEQ_TEST
/

DROP TRIGGER TEST_TRIGGER
/



CREATE TABLE TEST_SECUEN (
ID_TEST NUMBER(5),
TEST_DESC VARCHAR2(50),
TEST_STAT NUMBER(2))
/


CREATE SEQUENCE SEQ_TEST MINVALUE 1 MAXVALUE 9999999 INCREMENT BY 1 START WITH 1 NOCACHE ORDER NOCYCLE
/


INSERT INTO test_secuen (test_desc, test_stat)
VALUES ('ANTES DEL TRIGGER', 1)
/

SELECT * FROM TEST_SECUEN
/

CREATE OR REPLACE TRIGGER TEST_TRIGGER BEFORE INSERT ON TEST_SECUEN
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
BEGIN

SELECT seq_test.NEXTVAL
INTO :NEW.id_test
FROM dual;

END;
/


INSERT INTO test_secuen (test_desc, test_stat)
VALUES ('ANTES DEL TRIGGER', 1)
/

SELECT * FROM TEST_SECUEN
/


ESPERO TE SEA DE UTILIDAD.
  #6 (permalink)  
Antiguo 09/07/2008, 03:09
Avatar de popobcn
Moderador
 
Fecha de Ingreso: noviembre-2006
Ubicación: Cerdanyola del Vallès
Mensajes: 3.892
Antigüedad: 17 años, 4 meses
Puntos: 1142
Respuesta: NOVATO: Problema con Triggers ¿como hacerlo?

PERFECTOOOOOOOOOOOOOOOOOOOOOOO!!!!!

Puuuuuf por fin! La verdad es que me estaba volviendo loco! Por un lado por los nombres de las columnas que al ser importadas desde Access no los identificaba correctamente y por el otro por mi patente desconocimiento de ORACLE estaba a punto de tirar la toalla.

Muchas gracias a todos por vuestra ayuda!

Saludos :)
  #7 (permalink)  
Antiguo 10/07/2008, 09:07
 
Fecha de Ingreso: julio-2008
Mensajes: 8
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: NOVATO: Problema con Triggers ¿como hacerlo?

le agradezco quien me pueda ayudar necesito hacer un trigger para insertar en otra tabla la informacion que se haya actualizado en la sentencia update pero este update puede modificar varios o todos los campos de la tabla, como puedo hacerlo, estoy usando postgres para probarlo y luego pasarlo a oracle

es algo asi

update tabla set campo1=valor, campo2=valor.......

en el trigger que debo hacer en la funcion para tomar esos campos, y ademas debo guardar en la otra tabla el nombre del campo y de la tabla y del usuario

gracias a quien pueda ayudarme
  #8 (permalink)  
Antiguo 10/07/2008, 11:36
 
Fecha de Ingreso: junio-2008
Ubicación: D.F.
Mensajes: 62
Antigüedad: 15 años, 9 meses
Puntos: 1
Respuesta: NOVATO: Problema con Triggers ¿como hacerlo?

QUE TAL PARA ELLO TENDRÍAS QUE HACER UN TRIGGER FOR UPDATE Y COMPARAR LOS NUEVOS VALORES CONTRA LOS
ANTERIORES, PARA DETERMINAR SI CAMBIARON, Y DESPUÉS CON ESA INFORMACIÓN INSERTAR EN LA OTRA TABLA.

TE ANEXO UN EJEMPLO DE LO QUE PODRÍAS HACER.

SQL> CREATE TABLE TEST_AUDIT (
2 ID_AUDIT NUMBER(5),
3 TABLA VARCHAR2(30),
4 COLUMNA VARCHAR2(30),
5 USUARIO VARCHAR2(30))
6 /

Tabla creada.

SQL>
SQL>
SQL>
SQL> CREATE TABLE TEST_UPDATE (
2 ID_TEST NUMBER(5),
3 TEST_DESC VARCHAR2(50),
4 TEST_STAT NUMBER(2))
5 /

Tabla creada.

SQL>
SQL>
SQL> CREATE OR REPLACE TRIGGER TEST_AUDIT_TRIGGER BEFORE UPDATE ON TEST_UPDATE
2 REFERENCING NEW AS NEW OLD AS OLD
3 FOR EACH ROW
4 DECLARE
5 vnMaxim NUMBER(5);
6 vvTabla VARCHAR2(30) := 'TEST_UPDATE';
7 BEGIN
8
9 IF(:NEW.TEST_STAT <> :OLD.TEST_STAT)THEN
10 SELECT COUNT(id_audit) + 1
11 INTO vnMaxim
12 FROM test_audit;
13
14 INSERT INTO TEST_AUDIT (id_audit, tabla, columna, usuario)
15 VALUES (vnMaxim, vvTabla, 'TEST_STAT', USER);
16 END IF;
17
18 END;
19 /

Disparador creado.

SQL>
SQL>
SQL> INSERT INTO test_update (id_test, test_desc, test_stat)
2 VALUES (1, 'ESTATUS ORIGINAL', 1)
3 /

1 fila creada.

SQL>
SQL> SELECT * FROM TEST_AUDIT
2 /

ninguna fila seleccionada

SQL>
SQL> UPDATE test_update
2 SET test_stat = 2
3 WHERE id_test = 1
4 /

1 fila actualizada.

SQL>
SQL> SELECT * FROM TEST_AUDIT
2 /

ID_AUDIT TABLA COLUMNA USUARIO
---------- ------------------------------ ------------------------------ ------------------------------
1 TEST_UPDATE TEST_STAT OSCARH


ESPERO TE SEA DE UTILIDAD.

SALUDOS
  #9 (permalink)  
Antiguo 10/07/2008, 12:23
 
Fecha de Ingreso: julio-2008
Mensajes: 8
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: NOVATO: Problema con Triggers ¿como hacerlo?

Gracias, he hecho lo que me dijiste pero cuando hago
update test_update set test_stat='xxx', test_desc where id_test=2
no me hace el segundo insert y estoy haciendo las comparaciones, no se por que se salta
  #10 (permalink)  
Antiguo 10/07/2008, 14:50
 
Fecha de Ingreso: julio-2008
Mensajes: 8
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: NOVATO: Problema con Triggers ¿como hacerlo?

Muchas gracias, me sirvio de mucho. Lo logre en Postgres, ahora me toca frentear a Oracle, creo que no es mucah la diferencia
  #11 (permalink)  
Antiguo 10/07/2008, 15:55
 
Fecha de Ingreso: junio-2008
Ubicación: D.F.
Mensajes: 62
Antigüedad: 15 años, 9 meses
Puntos: 1
Respuesta: NOVATO: Problema con Triggers ¿como hacerlo?

De nada, y cualquier cosa que se te atore en Oracle no dudes en Preguntar.

Saludos.
  #12 (permalink)  
Antiguo 04/08/2009, 15:06
 
Fecha de Ingreso: junio-2009
Mensajes: 6
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: NOVATO: Problema con Triggers ¿como hacerlo?

Se podrán ejecutar SP dentro de un Trigger? ya que he estado intentando pero no logro conseguirlo, debe haber algo que me este faltando, a ver si alguien me echa una manito.

CREATE OR REPLACE TRIGGER "DESCARTA"."TRGADEXPRESIONVALORACION"
AFTER DELETE ON "DESCARTA"."EXPRESIONCOMENTARIO"
FOR EACH ROW
BEGIN
exec UpdateExpresionValoracion(:old.IDEXPRESION);
END;

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 02:21.