2011-04-11 10 views
8

¿Es posible alinear eficazmente una tabla de base de datos de manera que cuando se agrega una nueva fila, una aplicación se notifica inmediatamente con la nueva fila? Cualquier base de datos puede ser utilizada.'tail -f' una tabla de base de datos

Respuesta

7

Use un disparador ON INSERT.

necesitará verificar los detalles sobre cómo llamar a las aplicaciones externas con los valores contenidos en el registro insertado, o escribirá su 'aplicación' como un procedimiento SQL y la ejecutará dentro de la base de datos.

Parece que querrá actualizar las bases de datos en general antes de que se arrincone con sus enfoques de línea de comando.

5
  • Sí, si la base de datos es un archivo de texto plano y los anexos se completan al final.
  • Sí, si la base de datos admite esta función de alguna otra manera; verifique el manual relevante.
  • De lo contrario, no. Las bases de datos tienden a ser archivos binarios.
+0

¿Conoce una base de datos específica que admite esta función, no lo soy. – avid

+0

@avid: no, lo siento. –

1

no estoy seguro, pero esto podría funcionar para las bases de datos de archivos planos primitivos/pero por lo que entiendo (y puedo estar equivocado) los archivos de bases de datos modernas están cifradas. Por lo tanto, leer una fila recién agregada no funcionaría con ese comando.

1

Me imagino que la mayoría de las bases de datos permiten escribir activadores, y usted podría tener un script que se desencadene en la escritura que le dice algo de lo que sucedió. No sé qué información estaría disponible, ya que dependería de la base de datos individual.

0

tail en Linux parece estar utilizando inotify para indicar cuándo cambia un archivo; probablemente usa marcos de notificaciones de sistema de archivos similares en otros sistemas operativos. Por lo tanto, detecta modificaciones de archivos.

Dicho esto, tail realiza una llamada fstat() después de cada cambio detectado y no se emitirá nada menos que el tamaño del archivo aumenta. Los sistemas de base de datos modernos usan acceso aleatorio a archivos y reutilizan páginas de base de datos, por lo que es muy posible que una fila insertada no cambie el tamaño del archivo de respaldo.

Le conviene más usar inotify (o similar) directamente, y aún mejor si usa activadores DB o cualquier mecanismo que su DBMS ofrezca para ver actualizaciones de DB, ya que no todas las actualizaciones de archivos son necesariamente inserciones de fila.

0

sólo estaba en el medio de la publicación de la misma respuesta exacta como glowcoder, además de otra idea:

La forma de baja tecnología para hacerlo es tener un campo de marca de tiempo, y tienen un programa ejecuta una consulta cada n minutos en busca de registros donde la marca de tiempo es mayor que la de la última ejecución. El mismo concepto se puede hacer almacenando la última clave vista si usa una secuencia, o incluso agregando un campo booleano "procesado".

0

Con Oracle puede seleccionar una columna de psuedo llamada 'rowid' que proporciona un identificador único para la fila en la tabla y rowid's son ordinales ... las nuevas filas obtienen rowids asignados que son mayores que cualquier rowid existente.

Así, en primer SELECT MAX (rowid) de nombre_tabla

Asumo que una de las causas de la cuestión que se plantea es que hay muchas, muchas filas de la tabla ...así que este primer paso gravará un poco al DB y tomará un tiempo.

A continuación, SELECT * FROM nombre_tabla donde rowid> 'whatever_that_rowid_string_was'

todavía tiene que ejecutar periódicamente la consulta, pero ahora es sólo una consulta rápida y de bajo costo

+0

acaba de volver a leer la pregunta ... sobre todo el 'cualquier parte de base de datos' ... respuesta retirado :) Me Suk – Rondo

1

Hay algunas opciones aquí, algunos de los cuales otros han notado:

  • Periódicamente sondear para nuevas filas. Con la forma en MVCC funciona sin embargo, es posible que se pierda una fila si había dos inserciones en mediados de transacción de la última vez consultada.
  • definir una función de activación que va a hacer un trabajo para usted en cada inserto. (En Postgres puede llamar a un comando notifique que otros procesos pueden escuchar.) Se puede combinar un disparador con escrituras en una mesa unpublished_row_ids para asegurar que su proceso de cola no se le escapa nada. (El proceso del tizón entonces suprimir ID de la tabla unpublished_row_ids ya que les procesa.)
  • gancho en la funcionalidad de replicación de la base de datos, si proporciona alguna. Esto debería tener un medio de garantizar que las filas no se pierdan.

he escribió en su blog con más detalle acerca de cómo hacer todas estas opciones con Postgres en http://btubbs.com/streaming-updates-from-postgres.html.

Cuestiones relacionadas