LLaver Foraneas como deshabilitarlo???

04/11/2006 - 06:43 por Developers - Dany Acosta | Informe spam
Amigos tengo dos tablas Relacionada por un Campo Cabecera_Factura y Detalle_Factura ambos estan
relacionados por el campo idfactura(FK en Detalle), el problema que tengo es que por necesidad en un
entorno cliente/servidor necesito almacenar primero los detalle_Factura y despues la
cabecera_Factura. Cuando intento hacer eso desde la aplicación o desde el mismo QA me arroja error
de Violacion de FK eso es correcto porque no deberia permitir.

Mi pregunta es existe alguna forma de deshabilitar los FK mientras se realiza las inserciones o
Updates dentro de los Store Procedure que llama la aplicación. y despues habilitarlo al realizar el
termino de la transaccion...

Gracias espero sus prontos comentarios

Dany Acosta - developers

Preguntas similare

Leer las respuestas

#6 Alejandro Mesa
06/11/2006 - 14:38 | Informe spam
Dany,

Todavia no entiendo muy bien lo que deseas hacer, pero te comento lo
siguiente. Si vas a hacer una carga masiva, preferible que deshabilites todo
tipo de indice y/ o referencia de clave foranea, dejando quizas el indice
clustered. Luego reindexas cuando termine la carga, verificas que filas no
cumplen con las restricciones para que estas sean borradas y reportadas, y
por ultimo calculas los acumulados que deseas. cuando este tipo de chequeo
y/o calculo se hace de forma intermedia en una carga masiva, los resultados
en cuanto a tiempo pueden ser los no esperados y muchas veces toma mucho mas
tiempo que hacerlo por parte.


AMB

"Developers - Dany Acosta" wrote:

Amigo Alejandro, necesito hacer cargas masivas algunas tablas pero
esas tablas tienen clave FK porque dependen de un Padre (Detalle y
Cabecera de Factura), mas o menos hablamos algo de 900,000 Registros en
el detalle y unos 200,000 registros en el Padre.
La idea es ir Insetando en el detalle y este a la vez con un trigger
vaya alimentando una Tabla de Acumulaciones de Cantidades x Fecha. por
eso existe la necesidad de Insertar primeros los detalles y despues las
cabeceras

Alejandro Mesa ha escrito:

> Dany,
>
> Vamos, no tomes el camino mas facil. De poder, claro que se puede, pero no
> se recomienda hacerlo. Por que no nos cuentas un poco mas de por que quieres
> hacerlo de esa forma?
>
> Las restricciones de clave foranea pueden ser deshabilitadas usando la
> sentencia "alter table", pero debes tener mucho cuidado, primero porque
> tendrias que alter la tabla dos veces por transaccion, la una para
> deshabilitar la restriccion y la otra para habilitarla. Si esto lo haces
> dentro de una transaccion, puedes interferiri con otras transacciones.
>
>
> AMB
>
> "Developers - Dany Acosta" wrote:
>
> > Amigos tengo dos tablas Relacionada por un Campo Cabecera_Factura y Detalle_Factura ambos estan
> > relacionados por el campo idfactura(FK en Detalle), el problema que tengo es que por necesidad en un
> > entorno cliente/servidor necesito almacenar primero los detalle_Factura y despues la
> > cabecera_Factura. Cuando intento hacer eso desde la aplicación o desde el mismo QA me arroja error
> > de Violacion de FK eso es correcto porque no deberia permitir.
> >
> > Mi pregunta es existe alguna forma de deshabilitar los FK mientras se realiza las inserciones o
> > Updates dentro de los Store Procedure que llama la aplicación. y despues habilitarlo al realizar el
> > termino de la transaccion...
> >
> > Gracias espero sus prontos comentarios
> >
> > Dany Acosta - developers
> >


Respuesta Responder a este mensaje
#7 Maxi
06/11/2006 - 16:17 | Informe spam
Porque lo queres evitar? ademas de no dejar la bdd en un estado peligroso de
integridad tambien estarias resolviendo que no se haga un block a los
registros si los vas pasando de a poco


Salu2

Microsoft MVP SQL Server
Culminis Speaker
INETA Speaker

"Developers - Dany Acosta" escribió en el mensaje
news:O$
Queria evitar eso... y hacerlo directo pero veo que no queda otra forma de
hacerlo o como dice el amigo alejandro aplicar los alter table...
pero eso me perjudica en las transacciones




Maxi escribió:
Hola, y hago una pregunta, no te es util en este tipo de trabajos tener
una tabla intermedia donde hacer la migracion de los datos y luego por
medio de un trigger en delete y haciendo delete de a n registros lo vas
pasando a produccion?

Respuesta Responder a este mensaje
#8 Dany Acosta
06/11/2006 - 22:13 | Informe spam
Ese es otro Punto que tan recomendable son los Indices Clustered si bien
es cierto te ordenan fisicamente la Tabla pero cuando hablamos de mas de
150,000.00 registros que impacto tienen cuando se insertan registros
antiguos(en las primeras posiciones).

SQL2000 puede trabajar bien sin usar indices Clustered o necesita de
Ellos para su performance????



Alejandro Mesa escribió:
Dany,

Todavia no entiendo muy bien lo que deseas hacer, pero te comento lo
siguiente. Si vas a hacer una carga masiva, preferible que deshabilites todo
tipo de indice y/ o referencia de clave foranea, dejando quizas el indice
clustered. Luego reindexas cuando termine la carga, verificas que filas no
cumplen con las restricciones para que estas sean borradas y reportadas, y
por ultimo calculas los acumulados que deseas. cuando este tipo de chequeo
y/o calculo se hace de forma intermedia en una carga masiva, los resultados
en cuanto a tiempo pueden ser los no esperados y muchas veces toma mucho mas
tiempo que hacerlo por parte.


AMB

"Developers - Dany Acosta" wrote:

Amigo Alejandro, necesito hacer cargas masivas algunas tablas pero
esas tablas tienen clave FK porque dependen de un Padre (Detalle y
Cabecera de Factura), mas o menos hablamos algo de 900,000 Registros en
el detalle y unos 200,000 registros en el Padre.
La idea es ir Insetando en el detalle y este a la vez con un trigger
vaya alimentando una Tabla de Acumulaciones de Cantidades x Fecha. por
eso existe la necesidad de Insertar primeros los detalles y despues las
cabeceras

Alejandro Mesa ha escrito:

Dany,

Vamos, no tomes el camino mas facil. De poder, claro que se puede, pero no
se recomienda hacerlo. Por que no nos cuentas un poco mas de por que quieres
hacerlo de esa forma?

Las restricciones de clave foranea pueden ser deshabilitadas usando la
sentencia "alter table", pero debes tener mucho cuidado, primero porque
tendrias que alter la tabla dos veces por transaccion, la una para
deshabilitar la restriccion y la otra para habilitarla. Si esto lo haces
dentro de una transaccion, puedes interferiri con otras transacciones.


AMB

"Developers - Dany Acosta" wrote:

Amigos tengo dos tablas Relacionada por un Campo Cabecera_Factura y Detalle_Factura ambos estan
relacionados por el campo idfactura(FK en Detalle), el problema que tengo es que por necesidad en un
entorno cliente/servidor necesito almacenar primero los detalle_Factura y despues la
cabecera_Factura. Cuando intento hacer eso desde la aplicación o desde el mismo QA me arroja error
de Violacion de FK eso es correcto porque no deberia permitir.

Mi pregunta es existe alguna forma de deshabilitar los FK mientras se realiza las inserciones o
Updates dentro de los Store Procedure que llama la aplicación. y despues habilitarlo al realizar el
termino de la transaccion...

Gracias espero sus prontos comentarios

Dany Acosta - developers






Respuesta Responder a este mensaje
#9 Dany Acosta
06/11/2006 - 22:23 | Informe spam
Estoy migrando cierta informacion de un Cliente de Db2 a SQL200Std y me
choque con una tabla que tiene algo de 900,000.00 en el Detalle, esta
tabla viene directamente desde DB2 la estructura es algo asi:

Tabla: Detalle de almacenes
DocumentoID Char(15) --> FK Proviene de la Cabecera
AlmacenID char(3) --> FK de Tabla de Almacenes
ProcesoID char(4) --> FK Tabla de Tipos de Procesos
ProductoID Char(10) --> FK Tabla de Productos
Cantidad Decimal(9,2)
PedidoID Char(6) --> Fk Tabla de Atenciones

Si te fijas esta tabla tiene 5 Campos FK de diferentes tablas es por eso
que necesito deshabilitarlo temporalmente mientras se haga todo el
movimiento.

El Otro punto es que necesitaba deshabilitarlo temporalmente cuando un
documento sea Grabado en esa tabla(aplicacion windows)... osea

Inicia Transaccion
Deshabilitar Constraints FK
Llenar Detalle --> Aca dispara un Trigger para Acumular saldos
Llenar Cabeceras
Habilita Constraints FK
Finaliza Transaccion

Son 2 Puntos que lo estoy dando vueltas la Migracion y la Aplicacion
Cliente que manejan los usuarios

Gracias









Maxi escribió:
Porque lo queres evitar? ademas de no dejar la bdd en un estado peligroso de
integridad tambien estarias resolviendo que no se haga un block a los
registros si los vas pasando de a poco

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