2010-11-16 9 views
9

Nuestro cliente desea realizar un pedido antes de la fecha de creación del registro. Para mí, esto parece una variable del sistema, algún tipo de metadatos para el registro en sí.Microsoft SQL Server: ¿alguna forma de saber cuándo se creó un registro?

¿Hay alguna manera de saber cuándo se creó un registro sin crear realmente un campo de fecha y hora con un valor predeterminado de GetDate() y esperar que nadie lo modifique?

Respuesta

13

No.

Necesita tener una columna para esto.

¡Imagine qué tan grandes serían los metadatos si necesitara mantener un registro para cada registro de creación! ¿Desea también mantener los metadatos en sus metadatos para saber cuándo se actualizaron los metadatos? El uso del espacio puede escalar rápidamente.

SQL Server mantiene algunas estadísticas pero algo así de específico tendrá que provenir de un campo definido por el usuario.

Como nota al margen, puede hacer que sea más difícil alterar la fecha en su campo creado si utiliza una tabla de búsqueda. Cree una tabla "TableName_CreateDate" y use el PK de su tabla actual y un valor de fecha. Su fecha se encuentra en una ubicación diferente y es menos probable que se modifique, pero aún puede obtener JOIN para obtener su pedido. Debería crear un activador para actualizar esto con nuevos valores.

Si solo desea FECHA y no necesita un valor de fecha y hora, puede ir un paso más allá y solo tiene una tabla de fechas y una tabla de búsqueda que se une a eso. Es decir .:

Table->Table.PK + Date.Pk -> DateTable

Esto ahorraría una gran cantidad de espacio en el disco si tiene una gran cantidad de filas (4 bytes por fila creo).

1

No, ni siquiera en las tablas del sistema que yo sepa. Podrías hurgar en los viejos registros de transacciones, estoy seguro, pero nativamente, no.

-4

Si solo quiere realizar un pedido, puede considerar el uso de una columna timestamp.

No se puede relacionar con una fecha real, pero puede ordenarla.

+1

Aunque puede tener problemas si quieren comparar tablas con este método. – JNK

+0

no es grave, siempre y cuando OP conozca todos los beneficios y riesgos. :) – JNK

+0

Aah!Solo pensé que cometí un error en esta respuesta, pero ahora creo que no. Es hora de ir a la cama. De todos modos, modifíquela si no sirve de nada;) – thomaspaulb

4

Se debe agregar el campo de fecha de creación. Arregla la parte 'espero que nadie lo modifique' agregando un disparador en la actualización que no permite que ese campo se actualice, nunca.

0

Una vez vine con una especie de situación en la que el orden de las filas de una tabla es obligatorio, pero no hay disponible una columna de fecha y hora (CreateDateTime, UpdateDateTime, ..., etc.). Por lo tanto, solo los datos que tenía eran el registro de transacciones. Leer el registro de transacciones directamente no era útil, ya que no es fácil de analizar. encontré un programa llamado "ApexSQL Log" que fue muy útil. Tiene todas las opciones de filtrado y puede leer todos los datos de registro sin operaciones hardcore. Aunque esta solución fue satisfactoria para mí, tiene un inconveniente: solo se puede filtrar la fecha (Begin Time y Hora de finalización) de acuerdo con la operación de transacción. Si está buscando una operación de consulta, por ejemplo, una inserción, que está encapsulada en una transacción, no puede recuperar el tiempo exacto de inserción. (al menos no pude encontrar una forma), solo el tiempo de transacción. Si sus operaciones son todas atómicas, entonces literalmente puede tener toda la fila crear información de fecha.

Cuestiones relacionadas