PDA

Ver la Versión Completa : Ayuda con un triste trigger...


Berto2003
09-10-2007, 10:08:32
Hola amigos/as del foro:

He estado rompiendome la cabeza para solucionar un asunto que no sé si podré solucionar y es que además de estar empezando con SQL Server, tampoco he podido o no he sabido encontrar algún ejemplo similar en el foro o en Internet :D. Espero que podais ayudarme con un trigger. Mi pregunta es la siguiente. Necesito que cada vez que se inserte o actualice un registro de una tabla, se asigne la fecha en que se realizó la operación. ¿Puedo realizar esto en un trigger (after update) de la tabla? Tengo algo parecido a lo siguiente:

ALTER TRIGGER [TR_AU_TRIGGER1]
ON [dbo].[TABLA]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT OFF

IF (UPDATE(CAMPO1) OR UPDATE(CAMPO1) OR UPDATE(CAMPO2))
BEGIN
DECLARE @AHORA DATETIME
SET @AHORA = GETDATE()

UPDATE dbo.TABLA SET dbo.TABLAS.FECHA = @AHORA
FROM inserted i, dbo.TABLA
WHERE (i.CLAVE = dbo.TABLA.CLAVE)
END
END


¿Es correcto esto? :confused: Me refiero a que el tipo datetime tiene la fecha y la hora completa y no sé si por ahí puede estar el problema. Espero haberme explicado bien.


Gracias por todo,
Saludos. :)

sinalocarlos
09-10-2007, 17:41:37
Habia escrito una respuesta al tema pero después de verificar el triguer de prueba que hice en mi BD resulta que lo que había escrito no es correcto

Algún administrador me podría hacer el favor de borrar este post??


Disculpas por el inconveniente

duilioisola
09-10-2007, 18:26:05
Prueba a hacerlo en el trigger BEFORE Update.

En el After Update ya no se graban cambios en el registro. Este tipo de trigger es para hacer cosas después de que los datos han sido escritos y que lo que se haga luego sea teniendo esto en cuenta.

Yo trabajo con firebird, pero la lógica del BU y el AU debería ser la misma.

Supongo además, que no debes hacer el update de tabla dentro del trigger, sino que lo único que debes hacer es modificar el valor de fecha.

En firebird sería algo asi:

create trigger Tabla_BU for tabla active before update
begin
new.fecha = 'Now';
end


En SQLServer debe ser algo asi:

ALTER TRIGGER [TR_BU_TRIGGER1]
ON [dbo].[TABLA]
BEFORE UPDATE
AS
BEGIN
SET NOCOUNT OFF
IF (UPDATE(CAMPO1) OR UPDATE(CAMPO1) OR UPDATE(CAMPO2))
BEGIN
DECLARE @AHORA DATETIME
SET @AHORA = GETDATE()
dbo.TABLAS.FECHA = @AHORA {esto no se si será asi}
END
END


o quizás sea mejor sin definir variables intermedias:

ALTER TRIGGER [TR_BU_TRIGGER1]
ON [dbo].[TABLA]
BEFORE UPDATE
AS
BEGIN
SET NOCOUNT OFF
IF (UPDATE(CAMPO1) OR UPDATE(CAMPO1) OR UPDATE(CAMPO2))
BEGIN
dbo.TABLAS.FECHA = GETDATE() {esto no se si será asi}
END
END

nuk3zito
10-10-2007, 20:27:05
En SQL Server no existe eso que tiene Interbase/Firebird de After update o Before update... etc.

Todos los triggers son AFTER... (Deleted, Inserted, Updated)

nuk3zito
10-10-2007, 20:57:52
Me faltó contestar el tema principal, sorry.

En SQL Server SI puedes hacer directamente un update a la misma tabla que te disparó el trigger (y el trigger no se va a disparar de manera recursiva en estos casos)

Un ejemplo es este:


CREATE TRIGGER t_crm_Estados ON [dbo].[crm_Estados]
FOR INSERT, UPDATE
AS

declare @ID int

select @ID = (Select ID_Estado From Inserted )

update crm_Estados
set FechaMod =getdate()
where Id_Estado = @ID




y el mismo ejemplo pero en mi interpretación es este:


CREATE TRIGGER t_crm_Estados ON [dbo].[crm_Estados]
FOR INSERT, UPDATE
AS

update E
set E.FechaMod =getdate()
from crm_Estados E
inner join Inserted I on I.Id_Estado = E.Id_Estado




Saludos.

Berto2003
11-10-2007, 19:03:14
Muchas gracias a tod@s, sinalocarlos, duilioisola y nuk3sito.

Voy a probarlo en seguida,

Saludos,
Berto2003