2012-01-24 25 views
11

Estoy intentando crear un desencadenador simple usando TSQL (o SQL Server 2008). El problema es: mi activador actual está actualizando toda la tabla. Esto estuvo bien por un tiempo, pero ahora la tabla tiene más de 20k filas. Así que quiero un disparador que solo actualice las filas que se están insertando.Disparador que actualiza solo la fila insertada

Aquí es mi corriente de disparo simple:

CREATE TRIGGER trig_MyPplUpdate 
ON [Persons] 
FOR INSERT 
AS 
Begin 
Update Persons 
    set MyFile = NULL 
    where Len(MyFile) < 60 
End 

creo que voy a tener que utilizar la tabla "insertada" o la función row_number ordenada por la clave principal. ¿Algunas ideas?

Respuesta

19

Si es necesario usar un disparador aquí en absoluto, usaría un disparador INSTEAD OF para ajustar los valores antes de insertar y evitar la necesidad de JOIN volver a la tabla base y actualizarlos posteriormente.

CREATE TRIGGER trig_MyPplUpdate 
ON [Persons] 
INSTEAD OF INSERT 
AS 
    BEGIN 
     INSERT INTO Persons 
     SELECT foo, 
      bar, 
      CASE 
       WHEN Len(MyFile) >= 60 THEN MyFile 
      END 
     FROM Inserted 
    END 
+0

Bien, déjenme aclarar esto: un disparador "En vez de" significa que ANTES de que se inserte, mi disparador se disparará? Honestamente, no entiendo lo que escribió (seleccione de insertado? ¿Luego MyFile?) Y tendré que investigar más sobre esto en Internet, pero creo que esto es lo que quiero = -). Si quieres hacer mi vida más fácil, me puedes explicar un poco más, pero lo que escribiste es el punto de partida que necesitaba. ¡Gracias una tonelada! – Gaspa79

+1

@ Gaspa79 - Sí. SQL Server tomará su instrucción de inserción y construirá la pseudo tabla 'inserted' que tiene todas las columnas insertables de' [Persons] '. Luego selecciona de eso para hacer la inserción real en la tabla base. No proporcionó la estructura de su tabla, así que tuve que inventar los otros nombres de columna. –

+0

Ok genial! Lo estoy intentando en este momento. Supongo que cuando Len (MyFile)> = THEN Myfile se debe a que si no se cumple esa condición, no insertará el valor de la columna, por lo tanto será nulo. En el otro caso, cuando esté satisfecho, insertará la columna (MiArchivo). muchas gracias hombre, en serio = -). – Gaspa79

15

Necesita unirse a la pseudo tabla Inserted en su declaración UPDATE. Siempre tenga en cuenta que SQL Server dispara el desencadenador una vez por instrucción y esa instrucción puede muy bien modificar/insertar filas múltiples a la vez, por lo que su tabla Inserted muy probablemente contendrá más de una fila, solo debe tener esto en cuenta cuando escribes tu disparador

intentar algo como esto:

CREATE TRIGGER trig_MyPplUpdate 
ON [Persons] 
FOR INSERT 
AS 
    UPDATE dbo.Persons 
    SET MyFile = NULL 
    WHERE Len(MyFile) < 60 
    AND PersonID IN (SELECT DISTINCT PersonID FROM Inserted) 

o usar cualquier columna única (su clave primaria) usted tiene que conseguir exactamente esas filas que se han insertado.

+0

Gracias a todos por la ayuda, lo intentaré! – Gaspa79

Cuestiones relacionadas