Oracle 10g: usando correctamente ora_rowscn para detectar cambios fila de la tabla (es decir, inserciones, actualizaciones, eliminaciones)

dba.stackexchange https://dba.stackexchange.com/questions/5061

Pregunta

Algunas investigaciones en la comprobación cuando los registros de una tabla Última actualización, modifican o eliminan me ha llevado a la columna de la seudo conocido como ora_rowscn.

En primer lugar, hago esto:

select max(ora_rowscn) from tablename;

Me tome nota del número. Entonces hago una inserción, actualización, y una eliminación, cheque que el valor máximo antes y después de cada uno. Al parecer, para incrementar para cada tipo de cambio.

Si usted se pregunta por qué estoy haciendo esto, se almacena en caché una lista de entidades en nuestro servicio de Windows de C. Este servicio se ejecuta en dos servidores de carga equilibrada, así que hay una instancia separada de cada ejecución. Cuando se produce una actualización en el servidor A, B necesidades servidor a saber sobre él. Lo que quiero hacer es caché máximo (ora_rowscn) en una variable. Cada vez que nuestra aplicación va a insertar, actualizar o borrar un archivo, se obtendrá un nuevo máximo de la base de datos. Si el valor es diferente, entonces es obvio que sabe que tiene que ir a buscar una nueva lista de la base de datos.

Así que mi pregunta real es la siguiente:? ¿Hay otros inconvenientes que deben ser conscientes de que podrían dar lugar a una inserción, actualización o supresión de la inscripción no incrementar este valor

Editar:? Puede alguien complemento ora_rowscn como una etiqueta

¿Fue útil?

Solución

¿Hay otros inconvenientes que debería ser consciente de que el resultado podría en una inserción, actualización o supresión de un registro no incrementar este valor?

ora_rowscn es siempre incrementa cuando una fila cambios - pero en una configuración por defecto también puede ser incrementado cuando una fila no cambia

Si es necesario comprobar toda la mesa para udates, un método consiste en el uso de auditoría . Por otro lado, si sólo es necesario para comprobar la fila que está tratando de actualización para los conflictos, ora_rowscn con rowdependencies es ideal.

Otros consejos

Conseguir el máximo (ora_rowscn) requerirá una mesa de exploración completa cada vez que lo hace. Puede ser más rápido sólo para actualizar el caché cada vez.

Parece que usted necesita una manera de notificar al otro servicio que se produjo un cambio y lo que el cambio era. Se podría mantener una tabla de madera con una columna que indica qué sistema necesita consumir el cambio. La columna puede tener dos funciones índices basados ??uno para cada servicio de manera que cada índice contiene sólo las entradas que deben ser consumidos. Luego, a medida que se consumen pueden hacer que el valor NULL para eliminarlo del índice.

O es posible que utilices cola avanzada .

Como se señaló @Leigh Riffel, un máximo de selección (ora_rowscn) dará lugar a un escaneo completo de tabla. Una alternativa es tener una columna de marca de tiempo (que llamaremos sys_ts para este ejemplo) que se llena a la hora de la ejecución de la sentencia (que no es lo mismo que el compromiso declaración, que es cuando se genera el SCN / poblada). Un índice en la columna de la sys_ts le permitirá mirar el x más reciente (digamos 25) filas para encontrar los ora_rowscn max sólo de aquellas filas.

La forma más directa de hacer esto sería utilizar la rownum a los resultados de límite como se describe en este [1] pedir el artículo tom:

select *
from (select sys_ts, ora_rowscn
from table order by SYS_TS desc) where rownum < 25;

Por desgracia, que también da lugar a un escaneo completo de tabla (por lo menos en Oracle 11.2.0.3). Esto ha sido reportado a Oracle, pero determinado que no es un defecto (error 17347125).

Esto requiere un poco más de trabajo para lograr efectivamente el mismo resultado:

select b.sys_ts,b.ora_rowscn from
    (select rid from 
        (select rowid as rid from table order by sys_ts desc) 
    where rownum <= 25) a, table b
where a.rid = b.rowid;

[1] - http: // www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top