Ver Mensaje Individual
  #53 (permalink)  
Antiguo 07/09/2012, 23:02
Avatar de matanga
matanga
 
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 6 meses
Puntos: 85
Respuesta: Incrementar un campo desde un trigger

No tengo muy claro el escenario completo, pero si la única diferencia entre la tabla origen y la tabla destino es el campo Id, entonces insisto en la recomendación inicial: no necesitas crear y mantener la tabla destino ya que el valor de Id puede ser un campo calculado utilizando la función rank() sobre la tabla origen. Suponiendo que T1 es origen y T2 es destino, puedes tener:

Código:
create table T1 (campo1, campo2)
go

create view T2 as
 select rank() over (partition by campo1 order by campo2) as id,
 campo1,
 campo2
 from t1
go
De lo contrario, si por alguna razón necesitas crear la tabla destino, no puedes utilizar la función rank() sobre la tabla lógica Inserted del trigger, y esto es porque Inserted solo contiene el registro insertado o los registros actualizados, mientras que la función rank() en la consulta propuesta solo funciona con el total de los registros. En este caso, puedes tener dos opciones para el trigger de T1:

1. Pasar todos los registros de T1 a T2 en cada ejecución del trigger.

Código:
create trigger trg1 on t1
after insert
as
begin
 truncate table t2;
 insert into t2
 select 
  rank() over (partition by campo1 order by campo2) as id,
  campo1,
  campo2
 from t1;
end;
go
2. Si tienes alguna forma de relacionar T1 y T2 (ej: campo_ident), pasar solo los registros nuevos.

Código:
create trigger trg1 on t1
after insert
as
begin
 insert into t2
 select 
  rank() over (partition by campo1 order by campo2) as id,
  campo1,
  campo2
 from t1
 where 
   campo_ident not in (select campo_ident from t2);
end;
go
Saludos