Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-10-2007
Berto2003 Berto2003 is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 59
Poder: 22
Berto2003 Va por buen camino
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 . 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? 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.
Responder Con Cita
  #2  
Antiguo 09-10-2007
sinalocarlos sinalocarlos is offline
Miembro
 
Registrado: sep 2006
Posts: 152
Poder: 18
sinalocarlos Va por buen camino
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

Última edición por sinalocarlos fecha: 09-10-2007 a las 17:46:18.
Responder Con Cita
  #3  
Antiguo 09-10-2007
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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

Última edición por duilioisola fecha: 09-10-2007 a las 18:30:14.
Responder Con Cita
  #4  
Antiguo 10-10-2007
Avatar de nuk3zito
nuk3zito nuk3zito is offline
Miembro
 
Registrado: ago 2003
Ubicación: "Z" Land
Posts: 244
Poder: 21
nuk3zito Va por buen camino
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)
__________________
Tiempo y ocasión acontecen a todos!
Responder Con Cita
  #5  
Antiguo 10-10-2007
Avatar de nuk3zito
nuk3zito nuk3zito is offline
Miembro
 
Registrado: ago 2003
Ubicación: "Z" Land
Posts: 244
Poder: 21
nuk3zito Va por buen camino
Wink 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.
__________________
Tiempo y ocasión acontecen a todos!
Responder Con Cita
  #6  
Antiguo 11-10-2007
Berto2003 Berto2003 is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 59
Poder: 22
Berto2003 Va por buen camino
Muchas gracias a tod@s, sinalocarlos, duilioisola y nuk3sito.

Voy a probarlo en seguida,

Saludos,
Berto2003
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
ayuda sobre trigger (disparadores) gabrielflowers PHP 9 20-10-2007 01:43:43
...contento y triste.... Jure Humor 5 27-08-2007 22:13:31
La neurona triste santana Humor 9 15-06-2004 15:22:21
Ayuda con trigger...!! Raptor SQL 3 26-04-2004 17:13:52
Ayuda con TRIGGER Programer Oracle 1 22-03-2004 05:45:16


La franja horaria es GMT +2. Ahora son las 20:23:53.


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
Copyright 1996-2007 Club Delphi