Columnas iguales en cabecera y detalle.

14/11/2005 - 08:32 por José Antonio | Informe spam
Por motivo de rendimiento en consultas estadisticas posteriores tengo en una
tabla cabecera y otra detalle de la misma, tres columnas repetidas, para que
puedan ser claves y los select estadisticos posteriores se ejecuten con
mayor rapided.

Tabla cabecera tiene las columans cliente,agente y fecha.
Tabla detalle tambien tiene estas tres columnas.

En un trigger de update para la tabla cabecera tengo el siguiente codigo
para que si una o varias de estas columnas cambian en la cabecera tambien
cambien en el detalle:

if update(cliente) or update(agente) or update(fecha)
updare detalle set cliente=c.cliente,agente=c.agente,fecha=c.fecha
from detalle d join inserted c on c.numero=d.numero

El problema que tengo es que casi siempre me lo hace bien, pero falla
esporadicamente de vez en cuando sin que se genere ningun error.

¿Hay alguna manera de que automaticamente el sqlserver cambie estas columnas
sin tener que utilizar el trigger?
¿Teneis alguan idea de porque puede fallar de vez en cuando este trigger?.


Saludos y gracias.

Preguntas similare

Leer las respuestas

#1 José Antonio
14/11/2005 - 08:46 | Informe spam
En cuanto a lo de que falla el trigger me refiero que se modifican las
columnas de cliente o fecha o agente y estas se modifican en la cabecera,
pero no se reflejan los cambios en el detalle.

"José Antonio" escribió en el
mensaje news:%23%
Por motivo de rendimiento en consultas estadisticas posteriores tengo en
una tabla cabecera y otra detalle de la misma, tres columnas repetidas,
para que puedan ser claves y los select estadisticos posteriores se
ejecuten con mayor rapided.

Tabla cabecera tiene las columans cliente,agente y fecha.
Tabla detalle tambien tiene estas tres columnas.

En un trigger de update para la tabla cabecera tengo el siguiente codigo
para que si una o varias de estas columnas cambian en la cabecera tambien
cambien en el detalle:

if update(cliente) or update(agente) or update(fecha)
updare detalle set cliente=c.cliente,agente=c.agente,fecha=c.fecha
from detalle d join inserted c on c.numero=d.numero

El problema que tengo es que casi siempre me lo hace bien, pero falla
esporadicamente de vez en cuando sin que se genere ningun error.

¿Hay alguna manera de que automaticamente el sqlserver cambie estas
columnas sin tener que utilizar el trigger?
¿Teneis alguan idea de porque puede fallar de vez en cuando este trigger?.


Saludos y gracias.

Respuesta Responder a este mensaje
#2 Maxi
14/11/2005 - 12:54 | Informe spam
Hola, yo no veo nada raro en el trigger, lo que podrias hacer es poner una
traza y ver que esta pasando.

Que version de Service Pack tienes?


Salu2
Maxi [MVP SQL SERVER]


"José Antonio" escribió en el
mensaje news:%23%
Por motivo de rendimiento en consultas estadisticas posteriores tengo en
una tabla cabecera y otra detalle de la misma, tres columnas repetidas,
para que puedan ser claves y los select estadisticos posteriores se
ejecuten con mayor rapided.

Tabla cabecera tiene las columans cliente,agente y fecha.
Tabla detalle tambien tiene estas tres columnas.

En un trigger de update para la tabla cabecera tengo el siguiente codigo
para que si una o varias de estas columnas cambian en la cabecera tambien
cambien en el detalle:

if update(cliente) or update(agente) or update(fecha)
updare detalle set cliente=c.cliente,agente=c.agente,fecha=c.fecha
from detalle d join inserted c on c.numero=d.numero

El problema que tengo es que casi siempre me lo hace bien, pero falla
esporadicamente de vez en cuando sin que se genere ningun error.

¿Hay alguna manera de que automaticamente el sqlserver cambie estas
columnas sin tener que utilizar el trigger?
¿Teneis alguan idea de porque puede fallar de vez en cuando este trigger?.


Saludos y gracias.

Respuesta Responder a este mensaje
#3 Alejandro Mesa
14/11/2005 - 15:16 | Informe spam
José Antonio,

El trigger funcionara si la columna [numero] no cambia, pero si esta puede
cambiar, entonces el trigger estaria cambiando el valor de las columnas
"cliente, agente y fecha" de una fila que posiblemente no fue la original que
causo que el trigger se haya disparado.

En cuanto a evitar un trigger para esto, puedes usar la opcion "on update
cascade" cuando creas la restriccion de clave foranea.

Ejemplo:

create table t1 (
c1 int not null,
c2 int not null,
constraint pk_t1 primary key (c1, c2)
)
go

create table t2 (
c1 int not null,
c2 int not null,
c3 int not null identity primary key,
constraint fk_t2_t1 foreign key (c1, c2) references t1 (c1, c2)
on delete cascade
on update cascade
)
go

insert into t1 values(1, 1)
insert into t1 values(1, 2)
go

insert into t2(c1, c2) values(1, 1)
insert into t2(c1, c2) values(1, 2)
go

select * from t1
select * from t2
go

update t1
set c1 = 2
where c1 = 1 and c2 = 2
go

select * from t1
select * from t2
go

delete t1
where c1 = 1 and c2 = 1
go

select * from t1
select * from t2
go

drop table t2
drop table t1
go


AMB

"José Antonio" wrote:

Por motivo de rendimiento en consultas estadisticas posteriores tengo en una
tabla cabecera y otra detalle de la misma, tres columnas repetidas, para que
puedan ser claves y los select estadisticos posteriores se ejecuten con
mayor rapided.

Tabla cabecera tiene las columans cliente,agente y fecha.
Tabla detalle tambien tiene estas tres columnas.

En un trigger de update para la tabla cabecera tengo el siguiente codigo
para que si una o varias de estas columnas cambian en la cabecera tambien
cambien en el detalle:

if update(cliente) or update(agente) or update(fecha)
updare detalle set cliente=c.cliente,agente=c.agente,fecha=c.fecha
from detalle d join inserted c on c.numero=d.numero

El problema que tengo es que casi siempre me lo hace bien, pero falla
esporadicamente de vez en cuando sin que se genere ningun error.

¿Hay alguna manera de que automaticamente el sqlserver cambie estas columnas
sin tener que utilizar el trigger?
¿Teneis alguan idea de porque puede fallar de vez en cuando este trigger?.


Saludos y gracias.



Respuesta Responder a este mensaje
#4 José Antonio
15/11/2005 - 07:52 | Informe spam
No entiendo lo que me dices de que el trigger funcionara cuando la columna
numero no cambia.

La opcion de update en cascada ya la tengo puesta pero para la clave
principal que es numero, ya que las columnas cliente,agente y fecha no son
claves en la tabla cabecera.

Acaso el trigger se dispara antes de hacer el update en cascada?





"Alejandro Mesa" escribió en el
mensaje news:
José Antonio,

El trigger funcionara si la columna [numero] no cambia, pero si esta puede
cambiar, entonces el trigger estaria cambiando el valor de las columnas
"cliente, agente y fecha" de una fila que posiblemente no fue la original
que
causo que el trigger se haya disparado.

En cuanto a evitar un trigger para esto, puedes usar la opcion "on update
cascade" cuando creas la restriccion de clave foranea.

Ejemplo:

create table t1 (
c1 int not null,
c2 int not null,
constraint pk_t1 primary key (c1, c2)
)
go

create table t2 (
c1 int not null,
c2 int not null,
c3 int not null identity primary key,
constraint fk_t2_t1 foreign key (c1, c2) references t1 (c1, c2)
on delete cascade
on update cascade
)
go

insert into t1 values(1, 1)
insert into t1 values(1, 2)
go

insert into t2(c1, c2) values(1, 1)
insert into t2(c1, c2) values(1, 2)
go

select * from t1
select * from t2
go

update t1
set c1 = 2
where c1 = 1 and c2 = 2
go

select * from t1
select * from t2
go

delete t1
where c1 = 1 and c2 = 1
go

select * from t1
select * from t2
go

drop table t2
drop table t1
go


AMB

"José Antonio" wrote:

Por motivo de rendimiento en consultas estadisticas posteriores tengo en
una
tabla cabecera y otra detalle de la misma, tres columnas repetidas, para
que
puedan ser claves y los select estadisticos posteriores se ejecuten con
mayor rapided.

Tabla cabecera tiene las columans cliente,agente y fecha.
Tabla detalle tambien tiene estas tres columnas.

En un trigger de update para la tabla cabecera tengo el siguiente codigo
para que si una o varias de estas columnas cambian en la cabecera tambien
cambien en el detalle:

if update(cliente) or update(agente) or update(fecha)
updare detalle set
cliente=c.cliente,agente=c.agente,fecha=c.fecha
from detalle d join inserted c on c.numero=d.numero

El problema que tengo es que casi siempre me lo hace bien, pero falla
esporadicamente de vez en cuando sin que se genere ningun error.

¿Hay alguna manera de que automaticamente el sqlserver cambie estas
columnas
sin tener que utilizar el trigger?
¿Teneis alguan idea de porque puede fallar de vez en cuando este
trigger?.


Saludos y gracias.



Respuesta Responder a este mensaje
#5 José Antonio
15/11/2005 - 07:52 | Informe spam
Como puedo poner una traza para ver el comportamiento de los triggers?


"Maxi" escribió en el mensaje
news:u%
Hola, yo no veo nada raro en el trigger, lo que podrias hacer es poner una
traza y ver que esta pasando.

Que version de Service Pack tienes?


Salu2
Maxi [MVP SQL SERVER]


"José Antonio" escribió en el
mensaje news:%23%
Por motivo de rendimiento en consultas estadisticas posteriores tengo en
una tabla cabecera y otra detalle de la misma, tres columnas repetidas,
para que puedan ser claves y los select estadisticos posteriores se
ejecuten con mayor rapided.

Tabla cabecera tiene las columans cliente,agente y fecha.
Tabla detalle tambien tiene estas tres columnas.

En un trigger de update para la tabla cabecera tengo el siguiente codigo
para que si una o varias de estas columnas cambian en la cabecera tambien
cambien en el detalle:

if update(cliente) or update(agente) or update(fecha)
updare detalle set cliente=c.cliente,agente=c.agente,fecha=c.fecha
from detalle d join inserted c on c.numero=d.numero

El problema que tengo es que casi siempre me lo hace bien, pero falla
esporadicamente de vez en cuando sin que se genere ningun error.

¿Hay alguna manera de que automaticamente el sqlserver cambie estas
columnas sin tener que utilizar el trigger?
¿Teneis alguan idea de porque puede fallar de vez en cuando este
trigger?.


Saludos y gracias.





Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida