desencadenadores

11/11/2003 - 22:06 por Tolo | Informe spam
hola,

según he comentado en el msg anterior, tengo una tabla de lineas de facturas
con los campos: unidades, precio_unitario y total y mi intención es que el
desencadenador insert/update me calcule el total a partir de los valores de
unidades y precio_unitario.

para ello he creado el desencadenador:

CREATE TRIGGER Control_stock_linea ON dbo.T_linies
FOR INSERT, UPDATE
AS

update t_linies set total_bi=(unitats*preu_unitari)


pero el problema está en que esto no me modifica solamente el registro
actual, sino me modifica todos los registros de la BD y lo que mas miedo me
da es que me pueda mezclar los valores de las líneas.

muchísimas gracias

Preguntas similare

Leer las respuestas

#16 Eladio Rincon
12/11/2003 - 14:07 | Informe spam
claro !! por esto estoy por aquí ;-)
Eladio Rincón.
SQL Server MVP

http://eladio.europe.webmatrixhosting.net
"Comparte lo que sabes, aprende lo que no sepas", FGG.

"Accotto Maximiliano Damian" escribió
en el mensaje news:
mas bien!! aca estamos todos para aprender no?


ACCOTTO MAXIMILIANO DAMIAN
GERENTE DE SISTEMAS
UN SALUDO MUY CORDIAL
"Eladio Rincón" escribió en el mensaje
news:
Hola,

no problem, yo había intepretado que te referías a un orden secuencial y


tan
sólo quería aclararlo ... Al final salimos ganando todos ;-)

Eladio Rincón
SQL Server MVP
http://eladio.europe.webmatrixhosting.net

"Comparte lo que sabes, aprende lo que no sepas." FGG

"Accotto Maximiliano Damian" escribió
en el mensaje news:
> ok!! eso de lumigent.com no lo conocia, lo q yo queria era puntualizar


el
> uso de las tablas temporales Inserted y Deleted y del porque no habia


una
> Updated.
>
> Un abrazo
>
> ACCOTTO MAXIMILIANO DAMIAN
> GERENTE DE SISTEMAS
> UN SALUDO MUY CORDIAL
> "Eladio Rincón" escribió en el


mensaje
> news:
> Hola Accoto,
>
> me gustaría puntualizar un par de cosas:
> - cuando se realiza un update, SQL Server no siempre realiza un borrado


y
> una inserción de un registro para modificar el dato en la página; habrá
> ocasiones en que sólo modifique la columna afectada sin realizar
> borrado/inserción. Por ejemplo en muchas actualizaciones sencillas SOLO


se
> modifica las columnas afectadas: con el LogExplorer de Lumigent
> (http://www.lumigent.com) puedes ver el proceso (también lo puedes con
> select * from ::fn_dblog(null, null).
>
> -desde el punto de vista de un SGBD, no debemos pensar el orden en que


se
va
> a realizar la operación; si actualizo un registro, para mí será
transparente
> el modo en que el SGBD ha gestionado la modificación ... yo debo saber


que
> al final tendré el registro modificado con el valor que he especificado.
>
> Espero haber sido de ayuda.
>
> Eladio Rincón
> SQL Server MVP
> http://eladio.europe.webmatrixhosting.net
>
> "Comparte lo que sabes, aprende lo que no sepas." FGG
>
> "Accotto Maximiliano D." escribió


en
el
> mensaje news:
> > yes!! un update hace esto:
> >
> > Primero un delete y luego un insert
> >
> > por eso la tabla inserted es la tabla con los valores insertados (me
> > explico?)
> >
> >
> >
> > Accotto Maximiliano Damian
> > " Tolo" escribió en el mensaje
> > news:
> > > hola,
> > >
> > > entiendo que inserted se usa tanto para updates como inserts en la
> tabla,
> > > no?
> > >
> > > muchísimas gracias
> > >
> > > "Accotto Maximiliano D."


escribió
> en
> > el
> > > mensaje news:
> > > > deberias hacerlo asi para q no te haga eso: TE PUSE EN MAYUSCULAS
LOS
> > > > CAMBIOS
> > > >
> > > > CREATE TRIGGER Control_stock_linea ON dbo.T_linies
> > > > FOR INSERT, UPDATE
> > > > AS
> > > >
> > > > update dbo.T_linies
> > > > set INSERTED.total_bi=(INSERTED.unitats*INSERTED.preu_unitari)
> > > > FROM dbo.T_linies INNER JOIN INSERTED ON
> > > > (AQUI EL VINCULO ENTRE AMBAS TABLAS, SEGURO Q DEBERAS PONER NRO
> FACTURA
> > Y
> > > > NUMERO LINEA)
> > > >
> > > > Espero q te halla sido util
> > > >
> > > > Un abrazo
> > > >
> > > >
> > > > Accotto Maximiliano Damian
> > > > > hola,
> > > > >
> > > > > según he comentado en el msg anterior, tengo una tabla de lineas
de
> > > > facturas
> > > > > con los campos: unidades, precio_unitario y total y mi intención
es
> > que
> > > el
> > > > > desencadenador insert/update me calcule el total a partir de los
> > valores
> > > > de
> > > > > unidades y precio_unitario.
> > > > >
> > > > > para ello he creado el desencadenador:
> > > > >
> > > > > CREATE TRIGGER Control_stock_linea ON dbo.T_linies
> > > > > FOR INSERT, UPDATE
> > > > > AS
> > > > >
> > > > > update t_linies set total_bi=(unitats*preu_unitari)
> > > > >
> > > > >
> > > > > pero el problema está en que esto no me modifica solamente el
> registro
> > > > > actual, sino me modifica todos los registros de la BD y lo que


mas
> > miedo
> > > > me
> > > > > da es que me pueda mezclar los valores de las líneas.
> > > > >
> > > > > muchísimas gracias
> > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#17 Javier Loria
12/11/2003 - 15:02 | Informe spam
Hola:
Los campos calculados se calculan cuando se extraen los datos a menos
que construyas un indice sobre los mismos. Los triggers calculan los datos
el en momento de la insercion.
En cuanto a rendimiento, cuando realizas un trigger que calcula un total
como el que expresaste estas des-normalizando la BD y por ende la estas
haciendo mas lenta, por multiples razones. La mas relevante es que gastas
mas espacio en disco, y por ende es mas lento la lectura de las filas. Es
mas rapido para SQL Server calcular la multiplicacion de cantidad por
PrecioUnitario que leer el Total del disco.
Claro esto no siempre es cierto, un caso "simple" es el saldo de
articulos en inventario, aun cuando es posible calcular el saldo de un
inventario sumando y restando las entradas del un periodo, normalmente no se
hace porque se castiga mucho el desempeno.
Espero te sirva,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.


Tolo escribio:
Hola,

mi duda, está en el tema de rendimiento, pues a parte de este campo
tengo otros y no se si ello me podría sobrecargar el servidor,
sobretodo al realizar una consulta de varias líneas. O acaso los
campos calculados se calculan solamente cuando se modifica o inserta
una línea ?

gracias

"Javier Loria" escribió en el mensaje
news:#
Hola Tolo:
Necesita ser un Trigger?, Porque tal vez logras el mismo impacto
con una tabla asi:
/* Codigo de Creacion de Tabla *.
CREATE TABLE LineasFactura(
NumeroLinea INT NOT NULL PRIMARY KEY,
Unidades INT NOT NULL ,
PrecioUnitario DECIMAL(9,2) NOT NULL,
TotalLinea AS PrecioUnitario*Unidades
)

/* Ingresa Valores */
INSERT LineasFactura(NumeroLinea, Unidades, PrecioUnitario)
VALUES (1,10,12.5)

INSERT LineasFactura(NumeroLinea, Unidades, PrecioUnitario)
VALUES (2,11,23)

/* Pruebas el Calculo *.
SELECT * FROM LineasFactura
/* Fin */

Estas mucho mas seguro con una columna calculada que con un Trigger.
En todo caso tu trigger no funciona porque le falta el JOIN. Algo
como:

UPDATE T_Linies
SET Total=INSERTED.unitas*INSERTED.preu_unitari
FROM T_Linies JOIN Inserted ON
T_Linies.MiLLavePrimaria=Inserted.MiLlavePrimaria

Espero te sirva,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.



Tolo escribio:
hola,

según he comentado en el msg anterior, tengo una tabla de lineas de
facturas con los campos: unidades, precio_unitario y total y mi
intención es que el desencadenador insert/update me calcule el total
a partir de los valores de unidades y precio_unitario.

para ello he creado el desencadenador:

CREATE TRIGGER Control_stock_linea ON dbo.T_linies
FOR INSERT, UPDATE
AS

update t_linies set total_bi=(unitats*preu_unitari)


pero el problema está en que esto no me modifica solamente el
registro actual, sino me modifica todos los registros de la BD y lo
que mas miedo me da es que me pueda mezclar los valores de las
líneas.

muchísimas gracias
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida