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)
-   -   Cursores para Actualizar - SQL Server (https://www.clubdelphi.com/foros/showthread.php?t=55641)

BlueSteel 22-04-2008 23:48:17

Cursores para Actualizar - SQL Server
 
Hola a todos

Tengo un Trigger en el evento de eliminación para una tabla en especial... entonces lo que me hace el trigger es actualizar un dato en otra tabla...

esto me funciona bien siempre que se elimine un dato.. pero al eliminar más de un dato solo me realiza la actualización en el último dato eliminado... por lo cual me veo en la obligación de trabajar con cursores.. me acuerdo haber creado uno para inserciones masivas.. pero no se si se tratan igual para las actualizaciones...

Código SQL [-]
CREATE  TRIGGER TRIGG_DETALLE_BO ON [dbo].[Detalle] 
FOR DELETE
AS
begin  
     Declare @Abo_Codigo Int
     Select @Abo_Codigo = Abo_Codigo From Deleted

     Update Abono Set Abo_Estado='D'
     Where Abono.Abo_Codigo = @Abo_Codigo
end

bueno el anterior trigger me realiza eso.. pero como seria con un Cursor ??

Salu2:p:D

poliburro 22-04-2008 23:55:50

en oracle, se añade en la definición del triger que debe disparar para cada fila afectada por la operación. En interbase no existe eso?

BlueSteel 23-04-2008 00:08:35

Ok... pero como seria ???

Cita:

Empezado por poliburro (Mensaje 281850)
En interbase no existe eso?

quien dijo interbase :D:D:D

Salu2:p:D

poliburro 23-04-2008 03:28:26

Cita:

Empezado por BlueSteel (Mensaje 281853)
Ok... pero como seria ???


quien dijo interbase

jajaj perdón amigo, no se por que entendí interbase :P. Esta es la definición de un triger en oracle que se dispara por cada fila afectada en una operación.

Código SQL [-]

create or replace TRIGGER TRGADM_TDETREGABONOS_AFT
AFTER INSERT ON ADM_TREGABONOS 
REFERENCING OLD AS Viejos NEW AS Nuevos  FOR EACH ROW


Por cierto que versión de sql server utilizas?

jcarteagaf 23-04-2008 18:34:11

Cursores
 
Amigo Bluesteel, el uso de cursores es un tema muy debatido en los foros referentes a SQL Server, ya que en la opinión de la mayoria no se debe hacer uso excesivo de estos por la disminución del performance del Servidor, pero eso es tema para la sección de debates. Existen 2 soluciones a tu problema

1. Sin cursores

Código SQL [-]
    UPDATE T
    SET T.Abo_Estado='D'
    FROM Abono T
    JOIN Deleted D ON T.Abo_Codigo=D.Abo_Codigo
2. Con cursores

Código SQL [-]
 Declare @Abo_Codigo Int
 Declare MiCursor Cursor For 
    Select Abo_Codigo From Deleted
 Open MiCursor
 Fetch Next From MiCursor into @Abo_Codigo
 while @@Fetch_Status = 0
 begin
   Update Abono
   Set Abo_Estado='D'
   Where Abono.Abo_Codigo = @Abo_Codigo
   Fetch Next From MiCursor into @Abo_Codigo
 end
 Close MiCursor
 Deallocate MiCursor

Espero que te sirva. Saludos

BlueSteel 23-04-2008 19:27:44

Cita:

Empezado por jcarteagaf (Mensaje 282014)
Amigo Bluesteel, el uso de cursores es un tema muy debatido en los foros referentes a SQL Server, ya que en la opinión de la mayoria no se debe hacer uso excesivo de estos por la disminución del performance del Servidor, pero eso es tema para la sección de debates. Existen 2 soluciones a tu problema

Ok.. gracias... lo tendre en consideración... pero para esta ocación los usaré ya que no serán más de 9000 registros los que existen en la tabla.. y de esos cuando realizo una actualización siempre son de 2 a 5 registros a la vez....

por lo visto son pocos y la base tambien es pequeña..así que no se verá afectado el rendimiento...

Salu2


La franja horaria es GMT +2. Ahora son las 03:48:26.

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