Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Actualizaciones masivas

Estas en el tema de Actualizaciones masivas en el foro de SQL Server en Foros del Web. Hola Amigos del foro. Tengo un problema en sql y no se como resolverlo. yo necesito llevar un registro de las actualizaciones que se realizan ...
  #1 (permalink)  
Antiguo 04/12/2006, 11:11
 
Fecha de Ingreso: octubre-2006
Mensajes: 86
Antigüedad: 17 años, 6 meses
Puntos: 1
Exclamación Actualizaciones masivas

Hola Amigos del foro.
Tengo un problema en sql y no se como resolverlo.
yo necesito llevar un registro de las actualizaciones que se realizan en una tabla, yo se que eso lo puedo hacer con un trigger pero el problema es que en ocasiones se hacen actualizaciones masivas y es ahi donde el trigger entra en conflicto y me genera un error, entonces yo no se como puedo hacer para llevar el control de todas esas filas que se han actualizado a la hora de hacer la actualizacion masiva no se si existe una forma en sql de hacerlo.

si alguien sabe de alguna forma de hacerlo desde SQL les estaria muy agradecido que me la explicara gracias
  #2 (permalink)  
Antiguo 04/12/2006, 11:41
 
Fecha de Ingreso: noviembre-2006
Ubicación: México
Mensajes: 866
Antigüedad: 17 años, 5 meses
Puntos: 8
Que tal Nest.

Puedes decirnos cual es el error y pasarnos fragmentos de tu código fuente, para poderte ayudar.

Saludos.
  #3 (permalink)  
Antiguo 04/12/2006, 12:11
 
Fecha de Ingreso: octubre-2006
Mensajes: 86
Antigüedad: 17 años, 6 meses
Puntos: 1
Sonrisa

Gracias por tu tiempo fijate que el problema es que el trigger se me ejecuta cuando solo es un registro el que se actualiza pero cuando hacen un update masivo el trigger me da el siguiente error
"Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression."
el trigger que ejecuto es el siguiente:
Cita:
Create Trigger [Tgr_PedidoUpdate] on [dbo].[Pedido]
For Update
As
begin
/*------------------------------------------------------------------------------------------------------------------------------------------*/
declare @NombreTabla varchar(50), @Id_pedido int , @FechaActualizacion datetime, @Bandera int
/*------------------------------------------------------------------------------------------------------------------------------------------*/
DECLARE @Id_pedido_n VARCHAR(10), @Fecha_crea_n SMALLDATETIME, @doc_ref_n VARCHAR(20)
/*-----------------------------------------------------------------------------------------------------------------------------------------------------*/
DECLARE @Id_pedido_a VARCHAR(10), @Fecha_crea_a SMALLDATETIME, @doc_ref_a VARCHAR(20)
/*------------------------------------------------------------------------------------------------------------------------------------------------------*/
SET @NombreTabla = 'Pedido'
SELECT @Id_pedido = (SELECT Id_pedido FROM Inserted)
SET @FechaActualizacion = GETDATE()
SET @Bandera = 0
/*------------------------------------------------------------------------------------------------------------------------------------------------------*/
SELECT @Fecha_crea_a = (SELECT Fecha_crea FROM Deleted WHERE Id_pedido = @Id_pedido)
SELECT @Fecha_crea_n = (SELECT Fecha_crea FROM Inserted WHERE Id_pedido = @Id_pedido)
SELECT @doc_ref_a = (SELECT doc_ref FROM Deleted WHERE Id_pedido = @Id_pedido)
SELECT @doc_ref_n = (SELECT doc_ref FROM Inserted WHERE Id_pedido = @Id_pedido)
/*-----------------------------------------------------------------------------------------------------------------------------------------------------------*/
IF(@Fecha_crea_a <> @Fecha_crea_n)
BEGIN
DECLARE @CampoModificado_Fca varchar(20)
SET @CampoModificado_Fca = 'Fecha_crea'
INSERT INTO Materiales.dbo.PM_ChangeLogMat(NombreTabla, IdFilaAfectada, FechaCambio, Bandera, Campo_Modificado, CambioRea) values(@NombreTabla, @Id_pedido, @FechaActualizacion, @Bandera, @CampoModificado_Fca, 'Se Actualizo de:' + RTRIM(LTRIM(CONVERT(nvarchar, @Fecha_crea_a))) + ' a ' + RTRIM(LTRIM(CONVERT(nvarchar, @Fecha_crea_n))))
END

IF(@doc_ref_a <> @doc_ref_n)
BEGIN
DECLARE @CampoModificado_Drf varchar(20)
SET @CampoModificado_Drf = 'doc_ref'
INSERT INTO Materiales.dbo.PM_ChangeLogMat(NombreTabla, IdFilaAfectada, FechaCambio, Bandera, Campo_Modificado, CambioRea) values(@NombreTabla, @Id_pedido, @FechaActualizacion, @Bandera, @CampoModificado_Drf, 'Se Actualizo de:' + RTRIM(LTRIM(@doc_ref_a)) + ' a ' + RTRIM(LTRIM(@doc_ref_n)))
END

END
entonces lo que me han pedido es que en una tabla almacene todos las actualizaciones que se realizan en la tabla Principal pero quieren que lo haga desde SQL entonces no se como hacerlo.

No se si hay alguna forma de logar que un trigger se dispare en actualizaciones masivas o hay otra forma de llevar este control
  #4 (permalink)  
Antiguo 04/12/2006, 13:05
 
Fecha de Ingreso: noviembre-2006
Ubicación: México
Mensajes: 866
Antigüedad: 17 años, 5 meses
Puntos: 8
Que tal Nest.

Las tablas Deleted e Inserted tienen los registros anteriores y nuevos que se actualizarán, por lo que en la siguiente instrucción:

Código:
...
SELECT @Id_pedido = (SELECT Id_pedido FROM Inserted)
...
No es posible ejecutarla ya que devuelve varios valores cuando la actualización es masiva.

Te recomiendo hacer un cursor para que recorras la tabla Inserted( y Deleted), e ir registro por registro.

El trigger solo se ejecuta una vez y no lo hace registro por registro.

Saludos y cualquier duda aquí estamos.
  #5 (permalink)  
Antiguo 05/12/2006, 17:43
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
No es necesario hacer el cursor, basta con tener en cuenta operaciones a nivel de conjunto de registros en lugar de UN solo registro como lo hace el uso de variables.

Aqui tienes un ejemplo de como tienes que modificar tus sentencias.

INSERT INTO Materiales.dbo.PM_ChangeLogMat(clave, fecha, chango)
SELECT clave, getdate(), suser_sname()
FROM Inserted
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #6 (permalink)  
Antiguo 05/12/2006, 19:44
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Es correcto, solo te recomiendo que las actualizaciones masivas no las hagas en un Trigger, es mejor si haces un procedimiento de actualizacion estandar y le añades la actualizacion masiva que necesitas.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:49.