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:
-
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
yUPDATE
declaraciones para incluir la corrienteUserID
y fecha y hora actual. Si taluser ID
no se puede definir (usuario anónimo) se puede utilizar0
en su lugar y el valor predeterminado de las columnas (en caso de que nouser ID
se especifica seráNULL
). Cuando veasNULL
Se insertan valores, debe encontrar las declaraciones “culpables” y editarlas. -
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 (useGETUTCDATE()
por ejemplo). El problema aquí es que los disparadores no permiten pasar / aceptar parámetros. Entonces, como no está insertando eluser 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
yupdate
declaraciones debe utilizar elSET CONTEXT_INFO
para agregar elcurrent user ID
al contexto actual y en el disparador está utilizando elCONTEXT_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