Saltar al contenido

Cómo actualizar la columna de marca de tiempo del servidor SQL sin cambiar los datos del registro

Solución:

No quiero usar un número entero, porque no quiero tener que leer el valor para incrementarlo.

UPDATE Table SET
    IntColumn = IntColumn + 1

Si bien eso técnicamente requiere una lectura, no veo ningún problema con eso.

Siempre puede actualizar al mismo valor:

UPDATE Table SET
    SomeColumn = SomeColumn

que también activará la actualización de rowversion.

ADICIÓN: podría hacer una vista con la versión de fila máxima de los niños:

SELECT Parent.*, MaxChildRowVersion as ChildVersion
FROM Parent
JOIN (
    SELECT ParentId, MAX(RowVersion) as MaxChildRowVersion
    FROM Child
    GROUP BY ParentId
) as Child ON
     Parent.ParentId = Child.ParentId

Pero, no, no puede actualizar directamente una columna de versión de fila (aunque podría implementar su propio actualizable con @@ DBTS, binary (8) e INSTEAD OF triggers …)

¿Podría dar ejemplos de su último punto? Suena prometedor.

No, realmente no es así. 😉 Es demasiado trabajo cuando simplemente puede actualizar al mismo valor o usar una vista. Esas son las 2 opciones más fáciles.

Pero, para estar completo, una columna binaria (8) con un valor predeterminado de @@ DBTS (que devuelve el número de versión de la base de datos), y un disparador DESPUÉS DE ACTUALIZAR que también actualiza la columna binaria al nuevo @@ DBTS le dará un psuedo -tipo de versión de actualización que luego puede actualizar manualmente. Sin embargo, no sería más rápido ni mejor que simplemente actualizar alguna otra columna a su mismo valor.

Ronnie,

Primero de todo el timestamp Microsoft ha dejado de utilizar la sintaxis, por lo que debe utilizar rowversion, segundo el rowversion siempre está relacionado con la fila.

De la documentación:

rowversion

Cada base de datos tiene un contador que se incrementa para cada operación de inserción o actualización que se realiza en una tabla que contiene un rowversion columna dentro de la base de datos. Este contador es la base de datos rowversion.

Sin embargo, debido a la forma en que se implementa en el servidor SQL, debe usar desencadenadores para lograr lo que desea.

Algo como esto:

CREATE TRIGGER tgUpdateParentRowVersion ON ChildTable FOR INSERT, DELETE, UPDATE
AS
BEGIN
   /*
    * The updates below force the update of the parent table rowversion
    */
   UPDATE ParentTable
      SET ChildUpdate = ChildUpdate + 1
     FROM ParentTable a 
     JOIN inserted    i on a.pkParentTable = i.fkParentTable

   UPDATE ParentTable
      SET ChildUpdate = ChildUpdate - 1
     FROM ParentTable a 
     JOIN deleted     d on a.pkParentTable = d.fkParentTable
END

Lo crea o no, esto actualiza una columna RowVersion / Timestamp sin establecer una columna. Aviso @[email protected] es la única cláusula después de set. Estoy usando Sql Server 2017.

declare @foo nvarchar(50);

update dbo.MyTable
set @foo = @foo
where Id = @id
¡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 *