Maximiliano y Listaros, les mando el Trigger.
La idea es tengo 2 tablas, una, reg_expedientes (información de expedientes)
y otra reg_expedientes_estados que mantiene el historial de estados de los
expedientes.
Yo tengo que controlar el pasaje de expedientes.
Y mantengo una cierta redundancia, es decir, el último estado de un
expediente en la tabla historial tiene que coincidir con el estado de la
tabla de expedientes.
O digámoslo así, cuando uno modifica el estado en la tabla de expedientes,
yo genero el estado en la tabla historial. Lo mismo si modifico otro dato
que no sea el estado (por ejemplo un usuario distinto o no escribe el mismo
estado pero en otra fecha), entonces lo reflejo en la tabla historial
(actualizando la fecha o el usuario de la tabla historial).
Bueno, trato de explicarles lo más detalladamente posible.
Espero me respondan.
Atte.
Silvana.-
ALTER TRIGGER tg_reg_expedientes ON dbo.reg_expedientes AFTER insert,
update AS
--OJO, si en el UPDATE del ASP no se realiza un set fecha_estado=getdate(),
no se graba bien la fecha
declare @id_expediente int, @id_estado int, @fecha_estado
datetime, @id_usuario int, @id_sector int,
@id_expediente_ult int, @id_estado_ult int,
@fecha_estado_ult datetime, @id_usuario_ult int, @id_sector_ult int,
@id_expediente_estado int
begin transaction
declare crs cursor for
select id_expediente, id_estado, fecha_estado,
id_usuario, id_sector from inserted
open crs
fetch next from crs into @id_expediente, @id_estado,
@fecha_estado, @id_usuario, @id_sector
while @@fetch_status = 0
begin
set @id_estado_ult=-1
--consulto en la vista que tiene el último estado de la tabla historial
select
@id_expediente_estado=id_expediente_estado, @id_estado_ult=id_estado,
@fecha_estado_ult=fecha_estado, @id_usuario_ult=id_usuario,
@id_sector_ult=id_sector
from vw_reg_expedientes_estados where
[EMAIL PROTECTED] order by id_expediente_estado desc
--Controlo si difere la modificacion al
estado actual de la tabla historial de estados
--o no contiene su correspondiente registro
en la tabla historial de estados
if (@id_estado<>@id_estado_ult) or
@id_estado_ult=-1
begin
if
(@id_estado_ult<>-1)
set @fecha_estado=dateadd(ms,10,@fecha_estado) --si es nuevo el registro
inserta la misma fecha
insert into
reg_expedientes_estados (id_expediente, id_estado, fecha_estado, id_usuario,
id_sector)
values
(@id_expediente, @id_estado, @fecha_estado, @id_usuario, @id_sector)
end
else
begin
if
(@fecha_estado<>@fecha_estado_ult) or (@id_usuario<>@id_usuario_ult) or
(@id_sector<>@id_sector_ult)
begin
update reg_expedientes_estados
set [EMAIL PROTECTED],
[EMAIL PROTECTED],
[EMAIL PROTECTED],
[EMAIL PROTECTED]
where [EMAIL PROTECTED]
end
end
print @id_expediente_estado
fetch next from crs into @id_expediente,
@id_estado, @fecha_estado, @id_usuario, @id_sector
end
close crs
deallocate crs
commit transaction
-----Mensaje original-----
De: [email protected] [mailto:[EMAIL PROTECTED] En nombre de Maxi Accotto
Enviado el: viernes, 10 de agosto de 2007 23:53
Para: Silvana Natalia Quiroga
Asunto: [dbms] Triggers
jajaj, tampoco!!! vos no tenes que usar cursores, cada vez que armamos
algo con un cursor es porque algo esta mal, ya sea el diseño, el
conocimiento nuestro de tsql, etc. Contanos tus casos y veamos como
sacar esos cursores :)
El 10/08/07, Silvana Natalia Quiroga <[EMAIL PROTECTED]> escribió:
> Bueno no me reten!! Jejejejeje.
>
> Yo me confundí. El no necesita usar cursores porque sólo inserta. En
cambio
> yo, si quiero hacer controles sobre varias tablas y dependiendo de eso
> inserto o no cierta información, ahí sí no me quedaría otra.
> Me entienden?
> Y ahí sería al vicio usar transacciones?
>
> A ver si aprendo.
> Espero me respondan.
>
> Silvana.-
>
> -----Mensaje original-----
> De: [email protected] [mailto:[EMAIL PROTECTED] En nombre de Maxi Accotto
> Enviado el: viernes, 10 de agosto de 2007 15:39
> Para: Silvana Natalia Quiroga
> Asunto: [dbms] Triggers
>
> Hola Silvana, le recomendas usar un cursor? sabes que los cursores son
> el peor enemigo dentro de SQL? sabias que un trigger esta dentro de
> una transaccion y que estas deberian durar el minimo tiempo posible?
> pues es una muy pero muy mala idea usar cursores y peor si estan
> dentro de un trigger, nunca hagas eso.
> Si insertan mas de un registro no hay problema porque hacer
>
> INSERT INTO TUTABLA
> SELECT CAMPOS FROM INSERTED
>
> El 10/08/07, Silvana Natalia Quiroga <[EMAIL PROTECTED]> escribió:
> >
> >
> >
> > No queda recursivo porque insertas en otra tabla.
> >
> > Sí te aconsejo usar un cursor y recorrer toda la tabla inserted, por si
se
> > insertaron varios registros de una sola vez.
> >
> > También usar transacciones.
> >
> >
> >
> > Silvana.-
> >
> >
> > ________________________________
> >
> >
> > De: [email protected] [mailto:[EMAIL PROTECTED] En nombre de Jesús dos
Santos
> > Enviado el: viernes, 10 de agosto de 2007 15:07
> > Para: Silvana Natalia Quiroga
> > Asunto: [dbms] Triggers
> >
> >
> >
> > Puede ser algo asi??
> >
> >
> >
> > CREATE TRIGGER [nuevocodigo] ON [dbo].[Articulos_ing]
> >
> > FOR INSERT
> >
> > AS
> >
> > insert into articulos_ing
> >
> > select i.ingfecha,i.ingcantidad*3,i.ingkilos,123,i.remito
> >
> > from inserted i where i.codigo=456
> >
> >
> > ________________________________
> >
> >
> > De: [email protected] [mailto:[EMAIL PROTECTED] En nombre de Darío
Salvático
> > Enviado el: viernes, 10 de agosto de 2007 14:09
> > Para: [EMAIL PROTECTED]
> > Asunto: [dbms] Triggers
> >
> >
> >
> >
> > Se puede tranquilamente, mira en el help el uso de las tablas internas
> > deleted e inserted, que se generan automacticamente y contienen los
datos
> en
> > el estado anterior (deleted) y el nuevo estado (inserted), son utililes
> para
> > operar con ellos. Ademas podes usar lose trigger en dos modos, after o
> > instead off, este ultimo te permite realizar accones en 'lugar de '
> >
> >
> >
> >
> >
> > Saludos.
> >
> >
> > -----Mensaje original-----
> > De: [email protected] [mailto:[EMAIL PROTECTED] nombre de Jesús dos
Santos
> > Enviado el: Viernes, 10 de Agosto de 2007 01:21 p.m.
> > Para: [EMAIL PROTECTED]
> > Asunto: [dbms] Triggers
> >
> > Lista, una consulta técnica, quiero saber si se puede hacer por medio te
> un
> > trigger algo que me agregue un registro a una tabla.
> >
> > Quiero que cuando se ingrese un registro con x código en un campo,
> > automáticamente se agregue otro registro con otro codigo y los demas
> datos,
> > es posible esto?
> >
> > Desde ya muchas gracias nuevamente.
> >
> >
> >
> >
> >
> > __________ Información de NOD32, revisión 2442 (20070807) __________
> >
> > Este mensaje ha sido analizado con NOD32 antivirus system
> > http://www.nod32.com
> >
> >
> >
> > __________ Información de NOD32, revisión 2442 (20070807) __________
> >
> > Este mensaje ha sido analizado con NOD32 antivirus system
> > http://www.nod32.com
>
>
> --
> -----------------------------------------------------------
> Microsoft MVP en SQL Server
> Mentor asociado en SQLTotalConsulting
> (excelencia en servicios y consultoria SQLServer)
> Orador Culminis - Microsoft Influencier
> www.sqltotalconsulting.com
> -----------------------------------------------------------
>
>
> __________ Información de NOD32, revisión 2442 (20070807) __________
>
> Este mensaje ha sido analizado con NOD32 antivirus system
> http://www.nod32.com
>
>
>
>
--
-----------------------------------------------------------
Microsoft MVP en SQL Server
Mentor asociado en SQLTotalConsulting
(excelencia en servicios y consultoria SQLServer)
Orador Culminis - Microsoft Influencier
www.sqltotalconsulting.com
-----------------------------------------------------------
__________ Información de NOD32, revisión 2450 (20070810) __________
Este mensaje ha sido analizado con NOD32 antivirus system
http://www.nod32.com