Si un usuario cambia la tabla HelloWorlds
, entonces quiero 'acción que hicieron', la hora en que lo hicieron y una copia de la fila original insertada en HelloWorldsHistory
.Cómo copiar una fila insertada, actualizada y eliminada en un disparador de SQL Server
Preferiría evitar un desencadenante separado para insertar, actualizar y eliminar acciones debido a las longitudes de columna.
He intentado esto:
create trigger [HelloWorlds_After_IUD] on [HelloWorlds]
FOR insert, update, delete
as
if @@rowcount = 0
return
if exists (select 1 from inserted) and not exists (select 1 from deleted)
begin
insert into HelloWorldHistory (hwh_action, ..long column list..)
select 'INSERT', helloWorld.id, helloWorld.text ... and more from inserted
end
else
if exists (select 1 from inserted) and exists (select 1 from deleted)
begin
insert into HelloWorldHistory (hwh_action, ..long column list..)
select 'UPDATE', helloWorld.id, helloWorld.text ... and more from deleted
end
else
begin
insert into HelloWorldHistory (hwh_action, ..long column list..)
select 'DELETE', helloWorld.id, helloWorld.text ... and more from deleted
end
end
nunca he visto aparecer una inserción, pero he visto actualizaciones. Voy a probar 3 disparadores por separado, aunque mantener las listas de columnas no será divertido.
no utilice DELETED como fuente de datos para las ACTUALIZACIONES, solo estará registrando el valor anterior que ya estaba registrado. Su fila de registro será de tipo "Actualizar" pero los datos podrían haber sido de una inserción. Véame comentar en mi respuesta. –