Saltar al contenido

¿Cómo agrego una columna de “última modificación” y “creada” en una tabla de SQL Server?

Solución:

los created la columna es simple, solo un DATETIME2(3) columna con una restricción predeterminada que se establece cuando se inserta una nueva fila:

Created DATETIME2(3) 
   CONSTRAINT DF_YourTable_Created DEFAULT (SYSDATETIME())

Entonces, cuando inserta una fila en YourTable y no especifique un valor para Created, se establecerá en la fecha y hora actuales.

los modified es un poco más de trabajo, ya que tendrá que escribir un disparador para el AFTER UPDATE case y actualizarlo; no puede decirle declarativamente a SQL Server que haga esto por usted …

Modified DATETIME2(3)

y luego

CREATE TRIGGER updateModified
ON dbo.YourTable
AFTER UPDATE 
AS
   UPDATE dbo.YourTable
   SET modified = SYSDATETIME()
   FROM Inserted i
   WHERE dbo.YourTable.PrimaryKey = i.PrimaryKey

Necesitas unirte al Inserted pseudo tabla que contiene todas las filas que se actualizaron con su tabla base en su Clave primaria para esa mesa.

Y tendrás que crear esto AFTER UPDATE disparador para cada tabla que desea tener un modified columna en.

Generalmente, puede tener las siguientes columnas:

  • Ultima modificacion por
  • LastModifiedOn
  • Creado por
  • Creado en

dónde LastModifiedBy y CreatedBy son referencias a un users mesa (UserID) y el LastModifiedOn y CreatedOn las columnas son columnas de fecha y hora.

Tienes las siguientes opciones:

  1. Solución sin desencadenantes: he leído en alguna parte que “La mejor forma de escribir desencadenantes es no escribirlos.“y debe saber que, en general, están perjudicando el rendimiento. Por lo tanto, si puede evitarlos, es mejor hacerlo, incluso el uso de desencadenantes puede parecer lo más fácil de hacer en algunos casos.

    Así que edítelo todo INSERT y UPDATE declaraciones para incluir la corriente UserID y fecha y hora actual. Si tal user ID no se puede definir (usuario anónimo) se puede utilizar 0 en su lugar y el valor predeterminado de las columnas (en caso de que no user ID se especifica será NULL). Cuando veas NULL Se insertan valores, debe encontrar las declaraciones “culpables” y editarlas.

  2. Solución con desencadenantes: puede crear AFTER INSERT, UPDATE desencadenar y poblar las columnas de usuarios allí. Es fácil obtener la fecha y hora actuales en el contexto del disparador (use GETUTCDATE() por ejemplo). El problema aquí es que los disparadores no permiten pasar / aceptar parámetros. Entonces, como no está insertando el user ID valor y no puede pasarlo al disparador. ¿Cómo encontrar al usuario actual?

    Puede utilizar SET CONTEXT_INFO y CONTEXT_INFO. Ante todo tu insert y update declaraciones debe utilizar el SET CONTEXT_INFO para agregar el current user ID al contexto actual y en el disparador está utilizando el CONTEXT_INFO función para extraerlo.

Por lo tanto, cuando utilice activadores, deberá editar de nuevo todos sus INSERT y UPDATE cláusulas, por eso prefiero no usarlas.

De todos modos, si necesita tener solo columnas de fecha y hora y no creadas / modificadas por columnas, usar desencadenadores es más duradero y más fácil, ya que no va a editar ninguna otra declaración ahora y en el futuro.


Con SQL Server 2016 ahora podemos usar la función SESSION_CONTEXT para leer los detalles de la sesión. Los detalles se establecen mediante sp_set_session_context (como read-only o read and write). Las cosas son un poco fáciles de usar:

EXEC sp_set_session_context 'user_id', 4;  
SELECT SESSION_CONTEXT(N'user_id');  

Buen ejemplo.

Atención, lo anterior funciona bien, pero no en todos los casos, perdí mucho tiempo y encontré esto útil:

create TRIGGER yourtable_update_insert
ON yourtable
AFTER UPDATE 
as
begin
   set nocount on;
   update yourtable set modified=getdate(), modifiedby = suser_sname()
   from  yourtable t 
   inner join inserted i on t.uniqueid=i.uniqueid 
end
go

set nocount on; es necesario, de lo contrario, aparece el error:


Estudio de administración de Microsoft SQL Server


No se actualizó ninguna fila.

Los datos de la fila 5 no se confirmaron. Fuente del error: Microsoft.SqlServer.Management.DataTools. Mensaje de error: Los valores de fila actualizados o eliminados no hacen que la fila sea única o alteran varias filas (2 filas).

Corrija los errores y vuelva a intentarlo o presione ESC para cancelar los cambios.


OK Ayuda


¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *