Oracle - NECESITO REALIZAR SEGUIMIENTO A LOS DATOS DE LAS TABLAS DINAMICAMENTE

 
Vista:

NECESITO REALIZAR SEGUIMIENTO A LOS DATOS DE LAS TABLAS DINAMICAMENTE

Publicado por TRIGGER DINAMICO - ORACLE 11G (2 intervenciones) el 31/05/2018 17:37:11
Buenos Días, estoy tratando de realizar auditoria de los datos de mi tablas, de una forma dinámica con el siguiente código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
create or replace function FN_GET_CAMPO_ACTUALIZADO(P_NOMBRE_TABLA VARCHAR)
  return varchar2 AUTHID CURRENT_USER is
  CURSOR REG_CAMPO IS
    SELECT A.COLUMNA FROM GE_VW_DICCIONARIO_DATOS A WHERE TABLA = P_NOMBRE_TABLA;
  N            VARCHAR2(6) := ':NEW.';
  O            VARCHAR2(6) := ':OLD.';
  V_CAMPO      VARCHAR(100);
  V_SQL        VARCHAR2(500);
  V_FILTRO     VARCHAR2(1);
  V_COMENTARIO VARCHAR2(500);
  V_OLD_VALOR  VARCHAR2(500);
  V_NEW_VALOR  VARCHAR2(500);
 
BEGIN
  FOR REG_DET IN REG_CAMPO LOOP
    V_CAMPO := REG_DET.COLUMNA;
    V_SQL   := 'SELECT DECODE(' || N || REG_DET.COLUMNA || ',' || O ||
               REG_DET.COLUMNA || ',' || '1,0) FROM DUAL';
 
    EXECUTE IMMEDIATE v_sql
      INTO V_FILTRO;
 
    IF V_FILTRO = 1 THEN
      EXECUTE IMMEDIATE 'SELECT ' || N || REG_DET.COLUMNA || 'FROM DUAL'
        INTO V_NEW_VALOR;
      EXECUTE IMMEDIATE 'SELECT ' || O || REG_DET.COLUMNA || 'FROM DUAL'
        INTO V_OLD_VALOR;
 
      V_COMENTARIO := 'SE MODIFICO EL VALOR DEL CAMPO ' || V_CAMPO ||
                      ' DE ' || V_OLD_VALOR || ' POR ' || V_NEW_VALOR;
 
    END IF;
     return V_COMENTARIO;
  END LOOP;
exception
  when others then
    return SQLERRM;
END;

en donde GE_VW_DICCIONARIO_DATOS es una vista de la tabla ALL_TAB_COLUMNS donde filtro las tablas que he creado, la idea es llamar a esta función desde cada Trigger de cada tabla, para insertar el comentario devuelto en una única tabla de auditoria con otros datos de control, el problema es con el EXECUTE IMMEDIATE con :NEW y :OLD me arroja ORA-01008: NO TODAS LAS VARIABLES HAN SIDO ENLAZADAS, si alguien tiene alguna idea de alguna solución?. Gracias de Antemano
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de gilman
Val: 117
Bronce
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

NECESITO REALIZAR SEGUIMIENTO A LOS DATOS DE LAS TABLAS DINAMICAMENTE

Publicado por gilman (52 intervenciones) el 02/06/2018 09:18:06
El problema está en que :NEW y :OLD solo se pueden emplear dentro del trigger, una vez que llamas a la función no se pueden usar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

NECESITO REALIZAR SEGUIMIENTO A LOS DATOS DE LAS TABLAS DINAMICAMENTE

Realmente el problema no es eso, ya que si llevo el código del EXECUTE IMMEDIATE al trigger seguirá sin funcionar ya que el EXECUTE IMMEDIATE reconoce el :new y :old como variables bind y por ende retorna este error ORA-01008: NO TODAS LAS VARIABLES HAN SIDO ENLAZADAS, se por que se produce el error lo que no encuentro es una forma de darle solución a lo que estoy buscando, que es saber que campo exactamente se modifico de esa tabla, ya que si lo hiciera estáticamente tendría que preguntar en cada trigger de cada tabla si :new.col1<>:old.col1.....si :new.coln<>:old.coln, y en el caso de que varíe los nombres de los campos de mi tabla tendría que hacer un mantenimiento a los triggers cada vez que eso sucediese, sin embargo al obtener el nombre del campo/s desde el diccionario de datos, lo hago dinámicamente escribiendo un solo código sin importar la cantidad de campos que tenga cada tabla y tampoco si cambiaran su estructura.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 499
Oro
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

NECESITO REALIZAR SEGUIMIENTO A LOS DATOS DE LAS TABLAS DINAMICAMENTE

Publicado por Rafael (328 intervenciones) el 05/06/2018 09:31:47
Hola:

No me queda claro para que necesitas este tipo de seguimiento ... pero ...
Creo que estas reinventando la rueda....

1. Puedes consultar la vista V$SQL, en ella toda sentencia que se ejecuta en la base de datos se guarda, por lo que podrias buscar los updates y saber que columnas se modifican, el detalle es que a partir de esta informacion NO puedes determinar el valor previo.

2. El enunciado de lo que estas haciendo parte de esto:
"en donde GE_VW_DICCIONARIO_DATOS es una vista de la tabla ALL_TAB_COLUMNS donde filtro las tablas que he creado, la idea es llamar a esta función desde cada Trigger de cada tabla,"

No es muy sano hacer una vista de una vista, pro que all_tab_columns no es una tabla... pero pasando del tema la realidad es que vas a construir un Trigger para cada tabla y despues dices que no quieres hacer un mantenimiento para cada tabla....
"que es saber que campo exactamente se modifico de esa tabla, ya que si lo hiciera estáticamente tendría que preguntar en cada trigger de cada tabla si :new.col1<>:old.col1.....si :new.coln<>:old.coln, y en el caso de que varíe los nombres de los campos de mi tabla tendría que hacer un mantenimiento a los triggers cada vez que eso sucediese,"

Luego entonces, te diria que la solucion pasa por currarselo un poco mas...
Tienes que hacer un script que te construya el trigger de forma dinamica para cada tabla...

Mandas a un SPOOL la salida ...

Haces un primer cursor por la ALL_TABLES que te liste el nombre de las tablas del schema que quieres tratar.
En el loop de dicho cursor abres un segundo cursor en ALL_TAB_COLUMNS que te liste las columnas de la tabla que estas tratando.

Y realizas las comparaciones y salidas necesarias. Las mandas al spool de tal forma que te construya el cuerpo del trigger

Al final cierras el spool.
Con el fichero obtenido lo ejecutas como script y tienes cada trigger personalizado a la tabla....


Luego me pregunto, y en serio esta pregunta es real no tiene otra intencion que entender ...

Yo las BBDD con las que trabajo nunca tienen menos de 50 o 60 tablas (algunas el numero es ingente), tengo tablas con cientos de millones de datos y algunas hasta con miles de millones de datos, en el banco al que le trabajo hay una pequeña base de datos que tiene un tamaño de tan solo 50 Tb. si 50 TERABYTES, si yo estuviera planeando la auditoria que planteas ... tendria la BBDD de 50 TERAS y un LOG de AUDITORIA del DOBLE!!! 100 TERABYTES por que se conservaria el dato previo y el dato actual....

Asi que me mi duda es para que quieres realizar este LOG??? y te juro que la pregunta es HONESTA al 100%, y es decir que esperas ganar dando este seguimiento a la BBDD.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar