Gatillo de registro

Ir a: navegación, búsqueda de

En bases de datos relacionales, la Gatillo de registro o Disparador de la historia se trata de un mecanismo de grabación automática de la información cambia - insertar, actualizar y eliminar filas-en un tabla de base de datos.

Es una técnica particular para cambiar de captura de datosy, en almacenamiento de datos-para hacer frente a cambiando lentamente dimensiones.

Contenido

  • 1 Definición
    • 1.1 Notas de compatibilidad
    • 1.2 Almacenamiento de datos
  • 2 Implementación en común RDBMS
    • 2.1 IBM DB2[1]
    • 2.2 Microsoft SQL Server[2]
    • 2.3 MySQL
    • 2.4 Oracle
  • 3 Información histórica
  • 4 Ventajas
  • 5 Desventajas
  • 6 Ejemplos de uso
    • 6.1 Obtener la versión actual de una tabla
    • 6.2 Obteniendo la versión de una mesa en un determinado punto del tiempo
    • 6.3 Obtener la información de una entidad en un determinado punto del tiempo
    • 6.4 A la historia de una entidad
    • 6.5 A cuándo y cómo se creó una entidad
  • 7 Inmutabilidad de claves primarias
  • 8 Notas
  • 9 Véase también
  • 10 Referencias

Definición

Supongamos que hay un mesa que queremos auditar. Esto mesa contiene los siguientes columnas:

Columnn Column1, Column2,...,

El columna Columna1 se supone que es el clave principal.

Estos columnas se definen para los siguientes tipos:

Typen tipo1, tipo2,...,

El Gatillo de registro el (cambios de la escritura de obrasINSERTAR, ACTUALIZACIÓN y BORRAR operaciones) en el mesa en el otro, en la tabla Historial, definido como sigue:

CREAR MESA La tabla Historial se (
Columna1 Type1,
Column2 tipo2,
:: Columnn Typen,
StartDate DATETIME,
EndDate DATETIME
)

Como se muestra arriba, este nuevo mesa el mismo contiene columnas como el original mesay además dos nuevas columnas de tipo FECHA Y HORA: StartDate y EndDate. Esto se conoce como tupla versionado. Estos dos adicionales columnas definir un período de tiempo de la "validez" de los datos asociados con una entidad especificada (la entidad de la clave principal), o en otras palabras, se almacena como los datos fueron en el período de tiempo entre la StartDate (incluido) y EndDate (no incluido).

Para cada entidad (distinto clave principal) en el original mesa, se crea la siguiente estructura de la historia mesa. Los datos se visualizan como ejemplo.

example

Observe que si se muestran cronológicamente la EndDate columna de cualquier fila es exactamente el StartDate de su sucesor (si existe). Esto no significa que ambos filas son comunes a ese punto en el tiempo, ya que - por definición - el valor de EndDate No está incluido.

Hay dos variantes de la Gatillo de registro, dependiendo de cómo los antiguos valores (DELETE, UPDATE) y nuevos valores (INSERT, UPDATE) están expuestos al gatillo (es dependiente de RDBMS):

Valores antiguos y nuevos campos de una estructura de datos del registro

CREAR GATILLO La tabla Historial se ON OriginalTable PARA INSERTAR, BORRAR, ACTUALIZACIÓN AS
DECLARAR @Now DATETIME
CONJUNTO @Now = GETDATE()
 
/ * borrar sección * /
 
ACTUALIZACIÓN La tabla Historial se CONJUNTO EndDate = @Now DONDE EndDate IS NULL
   Y Columna1 = VIEJO.Columna1
/ * insertar sección * /
 
INSERTAR EN La tabla Historial se (Columna1, Column2, ...,Columnn, StartDate, EndDate) 
VALORES (Nuevo.Columna1, Nuevo.Column2, ..., Nuevo.Columnn, @Now, NULL)

Viejos y nuevos valores como filas de tablas virtuales

CREAR GATILLO La tabla Historial se ON OriginalTable PARA INSERTAR, BORRAR, ACTUALIZACIÓN AS
DECLARAR @Now DATETIME
CONJUNTO @Now = GETDATE()
 
/ * borrar sección * /
 
ACTUALIZACIÓN La tabla Historial se CONJUNTO EndDate = @Now De La tabla Historial se, ELIMINADO DONDE La tabla Historial se.Columna1 = ELIMINADO.Columna1 Y La tabla Historial se.EndDate IS NULL
 
/ * insertar sección * /
 
INSERTAR EN La tabla Historial se (Columna1, Column2, ..., Columnn, StartDate, EndDate)
SELECCIONE (Columna1, Column2, ..., Columnn, @Now, NULL)
  De INSERTA

Notas de compatibilidad

  • La función GetDate() se utiliza para obtener la fecha del sistema y el tiempo, un específico RDBMS podría usar otro nombre de la función, o conseguir esta información por otro camino.
  • Varios RDBMS (DB2, MySQL) no admiten que el mismo gatillo puede fijarse a más de una operación (INSERTAR, BORRAR, ACTUALIZACIÓN). En tal caso debe crearse un disparador para cada operación; Para un INSERTAR operación sólo el inserción de sección debe especificar, para una BORRAR operación sólo el eliminación de sección debe especificarse y para un ACTUALIZACIÓN operación ambas secciones deben estar presentes, tal como se muestra arriba (el eliminación de sección Primero, luego el inserción de sección), porque un ACTUALIZACIÓN operación lógicamente es representada como un BORRAR operación seguida por una INSERTAR operación.
  • En el código que se muestra la estructura de datos del registro que contiene el antiguo y nuevo valores se denominan VIEJO y Nuevo. En un específico RDBMS podrían tener nombres diferentes.
  • En el código mostrado, se llaman las tablas virtuales ELIMINADO y INSERTA. En un específico RDBMS podrían tener nombres diferentes. Otro RDBMS (DB2) que ni siquiera el nombre de estas tablas lógicas especificarse.
  • En el código mostrado, los comentarios son en el estilo de C y C++, no podrían ser apoyado por un específico RDBMS, o se debe utilizar una sintaxis diferente.
  • Varios RDBMS requieren que el cuerpo del disparador está incluido entre BEGIN y FINAL Palabras clave.

Almacenamiento de datos

De acuerdo con la cambiando lentamente la dimensión metodologías de gestión, la gatillo de registro cae en lo siguiente:

  • Tipo 2 (tupla versionado variante)
  • Tipo 4 (uso de tablas de la historia)

Implementación en común RDBMS

IBM DB2[1]

  • Un disparador no puede quedar enganchado a más de una operación (INSERTAR, BORRAR, ACTUALIZACIÓN), así que debe crearse un disparador para cada operación.
  • Se exponen los valores antiguos y nuevos campos de un registro de estructuras de datos. Los nombres de estos registros pueden ser definidos, en este ejemplo que se denominan como O para valores antiguos y N de nuevos valores.
--Gatillo para insertar
CREAR GATILLO BASE DE DATOS.TableInsert después de INSERTAR ON BASE DE DATOS.OriginalTable
HACE REFERENCIA A Nuevo AS N
PARA CADA FILA MODO DB2SQL
BEGIN
   DECLARAR Ahora FECHA Y HORA; CONJUNTO AHORA = CORRIENTE FECHA Y HORA; INSERTAR EN BASE DE DATOS.La tabla Historial se (Columna1, Column2, ..., Columnn, StartDate, EndDate)
   VALORES (N.Columna1, N.Column2, ..., N.Columnn, Ahora, NULL);
FINAL;
--Gatillo para eliminar
CREAR GATILLO BASE DE DATOS.TableDelete después de BORRAR ON BASE DE DATOS.OriginalTable
HACE REFERENCIA A VIEJO AS O
PARA CADA FILA MODO DB2SQL
BEGIN
   DECLARAR Ahora FECHA Y HORA; CONJUNTO AHORA = CORRIENTE FECHA Y HORA; ACTUALIZACIÓN BASE DE DATOS.La tabla Historial se CONJUNTO EndDate = Ahora DONDE Columna1 = O.Columna1 Y EndDate IS NULL;
FINAL;
--Gatillo para actualización
CREAR GATILLO BASE DE DATOS.TableUpdate después de ACTUALIZACIÓN ON BASE DE DATOS.OriginalTable
HACE REFERENCIA A Nuevo AS N VIEJO AS O
PARA CADA FILA MODO DB2SQL
BEGIN
   DECLARAR Ahora FECHA Y HORA; CONJUNTO AHORA = CORRIENTE FECHA Y HORA; ACTUALIZACIÓN BASE DE DATOS.La tabla Historial se CONJUNTO EndDate = Ahora DONDE Columna1 = O.Columna1 Y EndDate IS NULL; INSERTAR EN BASE DE DATOS.HistoyTable (Columna1, Column2, ..., Columnn, StartDate, EndDate)
   VALORES (N.Columna1, N.Column2, ..., N.Columnn, Ahora, NULL);
FINAL;

Microsoft SQL Server[2]

  • El mismo gatillo puede acoplarse a todos los INSERTAR, BORRAR, y ACTUALIZACIÓN operaciones.
  • Viejos y nuevos valores como filas de mesas virtuales llamadas ELIMINADO y INSERTA.
CREAR GATILLO TableTrigger ON OriginalTable PARA BORRAR, INSERTAR, ACTUALIZACIÓN AS
 
DECLARAR @NOW DATETIME
CONJUNTO @NOW = CURRENT_TIMESTAMP
 
ACTUALIZACIÓN La tabla Historial se CONJUNTO EndDate = @now De La tabla Historial se, ELIMINADO DONDE La tabla Historial se.ColumnID = ELIMINADO.ColumnID Y La tabla Historial se.EndDate IS NULL
 
INSERTAR EN La tabla Historial se (ColumnID, Column2, ..., Columnn, StartDate, EndDate)
SELECCIONE ColumnID, Column2, ..., Columnn, @NOW, NULL
  De INSERTA

MySQL

  • Un disparador no puede quedar enganchado a más de una operación (INSERTAR, BORRAR, ACTUALIZACIÓN), así que debe crearse un disparador para cada operación.
  • Se exponen los valores antiguos y nuevos campos de un registro de estructuras de datos llamado Viejo y Nuevo.
DELIMITER $$
/ * Disparador para insertar * /
CREAR GATILLO HistoryTableInsert después de INSERTAR ON OriginalTable PARA CADA FILA BEGIN
   DECLARAR N DATETIME; CONJUNTO N = Ahora(); INSERTAR EN La tabla Historial se (Columna1, Column2, ..., Columnn, StartDate, EndDate)
   VALORES (Nuevo.Columna1, Nuevo.Column2, ..., Nuevo.Columnn, N, NULL);
FINAL;
/ * Disparador para eliminar * /
CREAR GATILLO HistoryTableDelete después de BORRAR ON OriginalTable PARA CADA FILA BEGIN
   DECLARAR N DATETIME; CONJUNTO N = Ahora(); ACTUALIZACIÓN La tabla Historial se CONJUNTO EndDate = N DONDE Columna1 = VIEJO.Columna1 Y EndDate IS NULL;
FINAL;
/ * Disparador para UPDATE * /
CREAR GATILLO HistoryTableUpdate después de ACTUALIZACIÓN ON OriginalTable PARA CADA FILA BEGIN
   DECLARAR N DATETIME; CONJUNTO N = Ahora(); ACTUALIZACIÓN La tabla Historial se CONJUNTO EndDate = N DONDE Columna1 = VIEJO.Columna1 Y EndDate IS NULL; INSERTAR EN La tabla Historial se (Columna1, Column2, ..., Columnn, StartDate, EndDate)
   VALORES (Nuevo.Columna1, Nuevo.Column2, ..., Nuevo.Columnn, N, NULL);
FINAL;

Oracle

  • El mismo gatillo puede acoplarse a todos los INSERTAR, BORRAR, y ACTUALIZACIÓN operaciones.
  • Se exponen los valores antiguos y nuevos campos de un registro de estructuras de datos llamado :: VIEJO y :: NUEVO.
  • Es necesario poner a prueba la nulidad de los campos de la :: NUEVO registro que definen la clave principal (cuando un BORRAR la operación se realiza), con el fin de evitar la inserción de una nueva fila con valores null en todas las columnas.
CREAR OR REEMPLAZAR GATILLO TableTrigger después de INSERTAR OR ACTUALIZACIÓN OR BORRAR ON OriginalTable
PARA CADA FILA
DECLARAR Ahora FECHA Y HORA;
BEGIN
   SELECCIONE CURRENT_TIMESTAMP EN Ahora De Dual; ACTUALIZACIÓN La tabla Historial se CONJUNTO EndDate = Ahora DONDE EndDate IS NULL
      Y Columna1 = :VIEJO.Columna1; IF :Nuevo.Columna1 IS NO NULL ENTONCES
      INSERTAR EN La tabla Historial se (Columna1, Column2, ..., Columnn, StartDate, EndDate) 
      VALORES (:Nuevo.Columna1, :Nuevo.Column2, ..., :Nuevo.Columnn, Ahora, NULL); FINAL IF;
FINAL;

Información histórica

Por lo general, copias de seguridad de base de datos se utilizan para almacenar y recuperar información histórica. A copia de seguridad de base de datos es un mecanismo de seguridad, más que una forma efectiva para recuperar la información histórica de ready-to-use.

Un (completo) copia de seguridad de base de datos es sólo una instantánea de los datos en puntos específicos del tiempo, así que podíamos saber la información de cada instantánea, pero no podremos saber nada entre ellos. Información en copias de seguridad de base de datos es discreta en el tiempo.

Usando el gatillo de registro la información que sabemos no es discreta pero constante, podemos saber el estado exacto de la información en cualquier punto del tiempo, sólo se limita a la granularidad del tiempo proporcionado con el FECHA Y HORA tipo de datos de la RDBMS utilizado.

Ventajas

  • Es simple.
  • No es un producto comercial, funciona con las características disponibles en común RDBMS.
  • Es automático, una vez que se crea, funciona con ninguna otra intervención humana.
  • No es necesario tener buen conocimiento acerca de las tablas de la base de datos, o el modelo de datos.
  • No se requieren cambios en la programación actual.
  • Cambios en la corriente tablas No son necesarios, porque registrar datos de cualquier mesa se almacena en una diferente.
  • Funciona para las declaraciones tanto programadas y ad hoc.
  • Sólo cambia)INSERTAR, ACTUALIZACIÓN y BORRAR se registran operaciones), así que la tasa de crecimiento de las tablas de la historia son proporcionales a los cambios.
  • No es necesario aplicar el gatillo a todas las tablas de base de datos, puede ser aplicado a ciertos tablas, o ciertas columnas de un mesa.

Desventajas

  • No automáticamente almacena información acerca del usuario producir los cambios (no es usuario de base de datos, usuario del sistema de información). Esta información podría indicarse explícitamente. Podría aplicarse en sistemas de información, pero no en consultas ad hoc.

Ejemplos de uso

Obtener la versión actual de una tabla

SELECCIONE Columna1, Column2, ..., Columnn De La tabla Historial se DONDE EndDate IS NULL

Debe devolver el mismo resultado del todo original mesa.

Obteniendo la versión de una mesa en un determinado punto del tiempo

Supongamos que el @DATE variable contiene el punto o momento de interés.

SELECCIONE Columna1, Column2, ..., Columnn De La tabla Historial se DONDE @FECHA > = StartDate Y (@FECHA < EndDate OR EndDate IS NULL)

Obtener la información de una entidad en un determinado punto del tiempo

Supongamos que el @DATE variable contiene el punto o momento de interés y el @KEY variable contiene el clave principal de la entidad de interés.

SELECCIONE Columna1, Column2, ..., Columnn De La tabla Historial se DONDE Columna1 = @CLAVE
   Y @FECHA > = StartDate Y (@FECHA < EndDate OR EndDate IS NULL)

A la historia de una entidad

Supongamos que el @KEY variable contiene el clave principal de la entidad de interés.

SELECCIONE Columna1, Column2, ..., Columnn, StartDate, EndDate De La tabla Historial se DONDE Columna1 = @CLAVE
 ORDEN BY StartDate

A cuándo y cómo se creó una entidad

Supongamos que el @KEY variable contiene el clave principal de la entidad de interés.

SELECCIONE H2.Columna1, H2.Column2, ..., H2.Columnn, H2.StartDate De La tabla Historial se AS H2 IZQUIERDA EXTERIOR ÚNETE La tabla Historial se AS H1 ON H2.Columna1 = H1.Columna1 Y H2.Columna1 = @CLAVE
   Y H2.StartDate = H1.EndDate DONDE H1.EndDate IS NULL

Inmutabilidad de claves primarias

Puesto que el gatillo requiere clave principal siendo la misma a través del tiempo, es deseable para asegurar o maximizar su inmutabilidad, si un clave principal cambió su valor, la entidad que representa rompería su propia historia.

Hay varias opciones para lograr o maximizar la clave principal inmutabilidad:

  • El uso de un clave suplente como un clave principal. Puesto que no hay razón para cambiar un valor sin significado aparte de identidad y singularidad, nunca cambiaría.
  • Uso de un inmutable clave natural como un clave principal. En el diseño de una buena base de datos, un clave natural que puede cambiar no debe considerarse como un "verdadero" clave principal.
  • Uso de un mutable clave natural como un clave principal (es ampliamente desalentado) donde los cambios se propagan en todos los lugares donde es un clave externa. En tal caso, la tabla Historial debe verse también afectada.

Notas

El gatillo de registro fue escrito por Laurence R. Ugalde para generar automáticamente la historia de bases de datos transaccionales.

Véase también

  • Base de datos relacional
  • Clave principal
  • Clave natural
  • Clave suplente
  • Captura de datos de cambio
  • Cambiando lentamente la dimensión
  • Tupla versionado

Referencias

  1. ^ "La base de datos fundamentales" por Nareej Sharma et al (primera edición, Copyright IBM Corp. 2010)
  2. ^ "Microsoft SQL Server 2008 - desarrollo de base de datos" por Thobias Thernström et al (Microsoft Press, 2009)

Otras Páginas

Obtenido de"https://en.copro.org/w/index.php?title=Log_trigger&oldid=630035577"