2010-07-06 9 views
10

Tengo el siguiente activador pero no necesito encontrar la identidad de la fila, así que no actualizo todos los registros en la tabla. ¿Cómo puedo obtener la identidad de la fila afectada?Identidad de la fila insertada/actualizada en el desencadenador

BEGIN 
    UPDATE tb_Division SET LastModified = GetDate() WHERE "id of inserted/updated row" 
END 

Respuesta

15

Desde un disparador en MS SQL Server no distingue entre operaciones de registro único y de múltiples registros, debe unirse a la mesa con la tabla de pseudo insertado o utilizar una subselección:

UPDATE tb_Division 
SET LastModified = GETDATE() 
WHERE id IN (SELECT id FROM INSERTED) 

Identificación siendo el principal columna clave de su tabla.

4

¿Has visto la identificación de la tabla lógica inserted? Usted tiene que tener cuidado al usar los desencadenantes, como un disparador puede estar operando en más de una fila:

UPDATE tb_Division AS td 
    SET LastModified = GetDate() 
FROM INSERTED AS i 
WHERE td.id = = i.id 

Ver here para más detalles, y desde MSDN:

desencadenadores DML utilizar el borrado y tablas lógicas (conceptuales) insertadas. Son estructuralmente similares a la tabla en la que se define el activador, es decir, la tabla en la que se prueba la acción del usuario. Las tablas eliminadas e insertadas contienen los valores antiguos o nuevos valores de las filas que la acción del usuario puede cambiar. Por ejemplo, para recuperar todos los valores en la tabla eliminada, use:

+0

gracias por los enlaces. – Chin

0

Tenga en cuenta que un disparador puede manejar una tonelada de filas a la vez, ¡tendrá que tenerlo en cuenta!

Es necesario para unirse a su mesa para ser actualizado con el Inserted pseudo-columna en ese campo ID:

UPDATE dbo.tb_Division 
SET LastModified = GetDate() 
FROM Inserted i 
WHERE tb_Division.Id = i.Id 

o algo por el estilo.

Cuestiones relacionadas