Triguer

28/11/2008 - 01:04 por Victor M | Informe spam
Éste es un mensaje de varias partes en formato MIME.
=_NextPart_000_00EE_01C950B2.292FF7A0
format=flowed;
reply-type=original

Tengo un tirguer sobre una tabla articulo la cual cuando se actualiza se
dispara el triguer y va y cambia a otras bases de datos la
tabla articulo todo en el mismo servidor, cuando hago la actualizacion sobre
un registro lo hace bien, pero cuando hago una actualizacion masiva no lo
hace adjunto el
triguer, no se que pueda estar fallando espero alguien me pueda ayudar


Victor Montañez
Sistemas y Desarrollos Computacionales
(656) 616-84-84

=_NextPart_000_00EE_01C950B2.292FF7A0
format=flowed;
name="cambiarticulo.txt";
reply-type=original
filename="cambiarticulo.txt"

CREATE TRIGGER [CAMBIA_ARTICULO] ON [dbo].[Articulo]
FOR UPDATE
AS
DECLARE @Codigo char(10),
@Nivel tinyint,
@padre char(10),
@Tipo char(5),
@Afectable char(1),
@Descr char(80),
@Linea char(3),
@Inventa char(1),
@Porc_Desc decimal(12,2),
@Precio decimal(12,2),
@PrecioFecha datetime,
@CostoU decimal(12,2),
@CostoForaneo decimal(12,2),
@Precio_Ant decimal(12,2),
@FechaAnterior datetime,
@inv_ini int,
@Existencia int,
@Repara tinyint,
@Statusx char(1),
@Dama tinyint,
@Caballero tinyint,
@Unisex tinyint,
@Acetato tinyint,
@Metal tinyint,
@Titanio tinyint,
@Ppp tinyint,
@Solar tinyint,
@Polarizado tinyint,
@Flex tinyint,
@Seguridad tinyint,
@BajoMov tinyint,
@AceroInox tinyint,
@Activo tinyint,
@NoResurtir tinyint,
@AltoMov tinyint,
@BifPrg tinyint,
@LabExterno tinyint,
@ComparaGrad tinyint,
@Comentario varchar(100),
@Sql nVarchar(4000),
@Sucursal TinyInt,
@Sql2 NVarchar(1000),
@Cont int,
@preciook decimal(12,2),
@invok char(1)
Declare @Db sysname


SET @Sql=''
SELECT
@Codigo=Codigo,@Nivel=Nivel,@Padre=Padre,@Tipo=Tipo,@Descr=Descr,@Linea=Line
a,@Porc_Desc=Porc_Desc,
@Precio=Precio,@PrecioFecha=PrecioFecha,@CostoU=CostoU,@CostoForaneo=CostoF
oraneo,@Precio_Ant=Precio_Ant,
@FechaAnterior=FechaAnterior,@Inv_Ini=Inv_ini,@Existencia=Existencia,@Repar
a=Repara,@Statusx=Statusx,
@Dama=Dama,@Caballero=Caballero,@Unisex=Unisex,@Acetato=Acetato,@Metal=Meta
l,@Titanio=Titanio,@Ppp=Ppp,
@Solar=Solar,@Polarizado=Polarizado,@Flex=Flex,@Seguridad=Seguridad,@BajoMo
v=BajoMov,@AceroInox=AceroInox,
@Activo=Activo,@NoResurtir=NoResurtir,@AltoMov=AltoMov,@BifPrg=BifPrg,@Come
ntario=Comentario,@LabExterno=LabExterno,
@ComparaGrad=ComparaGrad,@Afectable=Afectable,@Inventa=Inventa from
INSERTED

set @preciook=@precio
set @invok=@Inventa
DECLARE Cursorx Cursor For Select ServidorEmp,Codigo from sucursales where
isnull(ServidorEmp,'') <>''
Open Cursorx
Fetch Next From Cursorx Into @Db,@Sucursal
While @@FETCH_STATUS = 0
Begin
Set @Cont=0
set @precio=@preciook--regresamos el precio normal
set @Inventa=@invok--regresamos el inventariable a su estado normal
If Exists(select * from exepcion where (codigo=@Codigo or
codigo=substring(@codigo,1,6)) and sucursal=@Sucursal)
Begin
Select @Precio=Precio from exepcion where (codigo=@Codigo or
codigo=substring(@codigo,1,6)) and sucursal=@Sucursal
End
If Exists(select * from excepinv where codigo=@Codigo and
sucursal=@Sucursal)
Begin
Select @Inventa=Iventariable from excepinv where codigo=@Codigo and
sucursal=@Sucursal
End
estamos posicionados

Set @Sql2 = N'Select @Cont=Count(*) From ' + quotename(Rtrim(Ltrim(@Db)))
+ N'.dbo.Articulo where Codigo = @Codigo'
exec sp_executesql @Sql2, N'@Cont int output, @Codigo char(10)', @Cont
output, @Codigo
If Isnull(@Cont,0)=0
Begin
Set @Sql = N'Insert Into '+
@DB+'.Dbo.articulo(Codigo,Nivel,Padre,Tipo,Descr,Linea,Porc_Desc,Precio,Prec
ioFecha,CostoU,CostoForaneo,Precio_Ant,FechaAnterior,Inv_ini,Existencia,Repa
ra,Statusx,Dama,Caballero,Unisex,Acetato,Metal,Titanio,Ppp,Solar,Polarizado,
Flex,Seguridad,BajoMov,AceroInox,Activo,NoResurtir,AltoMov,BifPrg,Comentario
,LabExterno,ComparaGrad,Afectable,Inventa)
Values(@Codigo,@Nivel,@Padre,@Tipo,@Descr,@Linea,@Porc_Desc,@Precio,@PrecioF
echa,@CostoU,@CostoForaneo,@Precio_Ant,@FechaAnterior,@Inv_Ini,@Existencia,@
Repara,@Statusx,@Dama,@Caballero,@Unisex,@Acetato,@Metal,@Titanio,@Ppp,@Sola
r,@Polarizado,@Flex,@Seguridad,@BajoMov,@AceroInox,@Activo,@NoResurtir,@Alto
Mov,@BifPrg,@Comentario,@LabExterno,@ComparaGrad,@Afectable,@inventa)'
EXEC sp_executesql @sql, N'@Codigo char(10),@Nivel tinyint,@Padre
char(10),@Tipo char(5),@Descr char(80),@Linea char(3),@Porc_Desc
decimal(12,2),@Precio decimal(12,2),@PrecioFecha datetime,@CostoU
decimal(12,2),@CostoForaneo decimal(12,2),@Precio_Ant
decimal(12,2),@FechaAnterior datetime,@inv_ini int,@Existencia int,@Repara
tinyint,@Statusx char(1),@Dama tinyint,@Caballero tinyint,@Unisex
tinyint,@Acetato tinyint,@Metal tinyint,@Titanio tinyint,@Ppp tinyint,@Solar
tinyint, @Polarizado tinyint,@Flex tinyint,@Seguridad tinyint,@BajoMov
tinyint,@AceroInox tinyint,@Activo tinyint,@NoResurtir tinyint,@AltoMov
tinyint,@BifPrg tinyint,@Comentario varchar(1000),@LabExterno
tinyint,@ComparaGrad tinyint,@Afectable char(10),@inventa
char(10)',@Codigo,@Nivel,@Padre,@Tipo,@Descr,@Linea,@Porc_Desc,@Precio,@Prec
ioFecha,@CostoU,@CostoForaneo,@Precio_Ant,@FechaAnterior,@inv_ini,@Existenci
a,@Repara,@Statusx,@Dama,@Caballero,@Unisex,@Acetato,@Metal,@Titanio,@Ppp,@S
olar,@Polarizado,@Flex,@Seguridad,@BajoMov,@AceroInox,@Activo,@NoResurtir,@A
ltoMov,@BifPrg,@Comentario,@LabExterno,@ComparaGrad,@Afectable,@inventa
end
ELSE
BEGIN
Set @Sql = N'UPDATE '+ @DB+'.Dbo.articulo SET
Codigo=@Codigo,Nivel=@Nivel,Padre=@Padre,Tipo=@Tipo,Descr=@Descr,Linea=@Line
a,Porc_Desc=@Porc_Desc,Precio=@Precio,PrecioFecha=@PrecioFecha,CostoU=@Costo
U,CostoForaneo=@CostoForaneo,Precio_Ant=@Precio_Ant,FechaAnterior=@FechaAnte
rior,Inv_ini=@Inv_ini,Repara=@Repara,Statusx=@Statusx,Dama=@Dama,Caballero=@
Caballero,Unisex=@Unisex,Acetato=@Acetato,Metal=@Metal,Titanio=@Titanio,Ppp=
@Ppp,Solar=@Solar,Polarizado=@Polarizado,Flex=@Flex,Seguridad=@Seguridad,Baj
oMov=@BajoMov,AceroInox=@AceroInox,Activo=@Activo,NoResurtir=@NoResurtir,Alt
oMov=@AltoMov,BifPrg=@BifPrg,Comentario=@Comentario,LabExterno=@LabExterno,C
omparaGrad=@ComparaGrad,Afectable=@Afectable,Inventa=@Inventa WHERE
CODIGO=@CODIGO'
EXEC sp_executesql @sql, N'@Codigo char(10),@Nivel tinyint,@Padre
char(10),@Tipo char(5),@Descr char(80),@Linea char(3),@Porc_Desc
decimal(12,2),@Precio decimal(12,2),@PrecioFecha datetime,@CostoU
decimal(12,2),@CostoForaneo decimal(12,2),@Precio_Ant
decimal(12,2),@FechaAnterior datetime,@inv_ini int,@Repara tinyint,@Statusx
char(1),@Dama tinyint,@Caballero tinyint,@Unisex tinyint,@Acetato
tinyint,@Metal tinyint,@Titanio tinyint,@Ppp tinyint,@Solar tinyint,
@Polarizado tinyint,@Flex tinyint,@Seguridad tinyint,@BajoMov
tinyint,@AceroInox tinyint,@Activo tinyint,@NoResurtir tinyint,@AltoMov
tinyint,@BifPrg tinyint,@Comentario varchar(1000),@LabExterno
tinyint,@ComparaGrad tinyint,@Afectable char(10),@inventa
char(10)',@Codigo,@Nivel,@Padre,@Tipo,@Descr,@Linea,@Porc_Desc,@Precio,@Prec
ioFecha,@CostoU,@CostoForaneo,@Precio_Ant,@FechaAnterior,@inv_ini,@Repara,@S
tatusx,@Dama,@Caballero,@Unisex,@Acetato,@Metal,@Titanio,@Ppp,@Solar,@Polari
zado,@Flex,@Seguridad,@BajoMov,@AceroInox,@Activo,@NoResurtir,@AltoMov,@BifP
rg,@Comentario,@LabExterno,@ComparaGrad,@Afectable,@inventa
END
Fetch Next From Cursorx Into @db,@Sucursal
End
Close Cursorx
Deallocate Cursorx








=_NextPart_000_00EE_01C950B2.292FF7A0--
 

Leer las respuestas

#1 Jose TH
28/11/2008 - 14:50 | Informe spam
Se ve claro que tu trigger (no triguer) o desencadenador está pensado para
un sólo registro, se ve cuando haces:
SELECT @Codigo=Codigo,@Nivel=Nivel,@Padre=Padre... from INSERTED
También se ve lo mismo en el UPDATE ... WHERE CODIGO=@CODIGO que armas con
sql dinámico (que por cierto no creo que sea recomendable usar sql dinámico
en un trigger).
Debes reprogramarlo para que considere ante todo que INSERTED puede tener
más de un registro.

Por otra parte, ya en un tema de rendimiento, se ve que usas un Cursor, lo
cual tampoco se recomienda a usar mucho menos en un trigger.


"Victor M" escribió en el mensaje
news:
Tengo un tirguer sobre una tabla articulo la cual cuando se actualiza se
dispara el triguer y va y cambia a otras bases de datos la
tabla articulo todo en el mismo servidor, cuando hago la actualizacion
sobre
un registro lo hace bien, pero cuando hago una actualizacion masiva no lo
hace adjunto el
triguer, no se que pueda estar fallando espero alguien me pueda ayudar


Victor Montañez
Sistemas y Desarrollos Computacionales
(656) 616-84-84

Preguntas similares