Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Ayuda con un triste trigger... (https://www.clubdelphi.com/foros/showthread.php?t=48959)

Berto2003 09-10-2007 10:08:32

Ayuda con un triste trigger...
 
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:
Código SQL [-]
create trigger Tabla_BU for tabla active before update
begin
   new.fecha = 'Now';
end

En SQLServer debe ser algo asi:
Código SQL [-]
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:
Código SQL [-]
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

Pequeña nota informativa.
 
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

ejemplos
 
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:

Código SQL [-]
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:

Código SQL [-]
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


La franja horaria es GMT +2. Ahora son las 08:58:39.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi