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