Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

BULK desactiva check llaves foraneas.

Estas en el tema de BULK desactiva check llaves foraneas. en el foro de SQL Server en Foros del Web. Hola, Tengo un problema. Tengo tres bases de datos SQL con sus tablas respectivamente. Estas tienen sus llaves primarias y foraneas. Al momento de utilizar ...
  #1 (permalink)  
Antiguo 30/11/2014, 20:51
 
Fecha de Ingreso: mayo-2005
Mensajes: 103
Antigüedad: 19 años, 7 meses
Puntos: 2
Pregunta BULK desactiva check llaves foraneas.

Hola,

Tengo un problema.
Tengo tres bases de datos SQL con sus tablas respectivamente. Estas tienen sus llaves primarias y foraneas.
Al momento de utilizar el comando bulk para cargar un archivo txt en una tabla, se modifica la validacion de la llave foranea pasando de CHECK a NOCHECK.

¿que puede ser?


Uso SQL Server 2008 express y SQL management

Gracias.:
  #2 (permalink)  
Antiguo 30/11/2014, 21:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: BULK desactiva check llaves foraneas.

¿Nunca probaste leer el manual de referencia?

Cita:
Sintaxis

Código SQL:
Ver original
  1. BULK INSERT
  2.    [ database_name . [ schema_name ] . | schema_name . ] [ TABLE_NAME | view_name ]
  3.       FROM 'data_file'
  4.      [ WITH
  5.     (
  6.    [ [ , ] BATCHSIZE = batch_size ]
  7. [B]   [ [ , ] CHECK_CONSTRAINTS ]
  8. [/B]   [ [ , ] CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ]
  9.    [ [ , ] DATAFILETYPE =
  10.       { 'char' | 'native'| 'widechar' | 'widenative' } ]
  11.    [ [ , ] FIELDTERMINATOR = 'field_terminator' ]
  12.    [ [ , ] FIRSTROW = first_row ]
  13.    [ [ , ] FIRE_TRIGGERS ]
  14.    [ [ , ] FORMATFILE = 'format_file_path' ]
  15.    [ [ , ] KEEPIDENTITY ]
  16.    [ [ , ] KEEPNULLS ]
  17.    [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]
  18.    [ [ , ] LASTROW = last_row ]
  19.    [ [ , ] MAXERRORS = max_errors ]
  20.    [ [ , ] ORDER ( { COLUMN [ ASC | DESC ] } [ ,...n ] ) ]
  21.    [ [ , ] ROWS_PER_BATCH = rows_per_batch ]
  22.    [ [ , ] ROWTERMINATOR = 'row_terminator' ]
  23.    [ [ , ] TABLOCK ]
  24.    [ [ , ] ERRORFILE = 'file_name' ]
  25.     )]

Argumentos

(...)

CHECK_CONSTRAINTS

Especifica que deben comprobarse todas las restricciones de la tabla o vista de destino durante la operación de importación masiva. Sin la opción CHECK_CONSTRAINTS, se omiten las restricciones CHECK y FOREIGN KEY, y, después de la operación, la restricción sobre la tabla se marca como de no confianza.
(...)
Según dice, es un comportamiento normal porque estás usando BULK INSERT sin la opcion requerida.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 01/12/2014, 09:12
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 4 meses
Puntos: 774
Respuesta: BULK desactiva check llaves foraneas.

Cita:
Iniciado por m@cd Ver Mensaje
Hola,

Tengo un problema.
Tengo tres bases de datos SQL con sus tablas respectivamente. Estas tienen sus llaves primarias y foraneas.
Al momento de utilizar el comando bulk para cargar un archivo txt en una tabla, se modifica la validacion de la llave foranea pasando de CHECK a NOCHECK.

¿que puede ser?


Uso SQL Server 2008 express y SQL management

Gracias.:
Bulk insert no esta recomendado para poner los datos directamente en tablas productivas o con llaves foraneas, te recomiendo que los datos que cargas con bulk insert lo hagas en tablas "stage o temporales" y despues ya muevas estos datos a las tablas productivas, asi mismo, que las tablas de stage esten en una base de datos aparte para que esta base la puedas tener en bulk logged recovery mode
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #4 (permalink)  
Antiguo 02/12/2014, 08:54
 
Fecha de Ingreso: mayo-2005
Mensajes: 103
Antigüedad: 19 años, 7 meses
Puntos: 2
Respuesta: BULK desactiva check llaves foraneas.

Hola, me sirvio el CHECK_CONSTRAINTS. Me hace las validaciones.
Al generar el script antes y despues de insertar la informacion en una tabla ocurre esto.

ANTES DE INSERTAR LA INFORMACION:

Object: ForeignKey [FK_1]
Código SQL:
Ver original
  1. ALTER TABLE [dbo].[V]  WITH CHECK ADD  CONSTRAINT [FK_1] FOREIGN KEY([E], [P], [TR])
  2. REFERENCES [dbo].[TR] ([E], [P], [TR])
  3. GO
  4. ALTER TABLE [dbo].[VE] CHECK CONSTRAINT [FK_1]
  5. GO

DESPUES DE INSERTAR INFORMACION:

Object: ForeignKey [FK_1]
Código SQL:
Ver original
  1. ALTER TABLE [dbo].[V]  WITH NOCHECK ADD  CONSTRAINT [FK_1] FOREIGN KEY([E], [P], [TR])
  2. REFERENCES [dbo].[TR] ([E], [P], [TR])
  3. GO
  4. ALTER TABLE [dbo].[VE] CHECK CONSTRAINT [FK_1]
  5. GO

¿Porque ocurre esto?
¿Modifica la base de datos?

Gracias.

Última edición por gnzsoloyo; 02/12/2014 a las 09:19
  #5 (permalink)  
Antiguo 02/12/2014, 12:21
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 5 meses
Puntos: 180
Respuesta: BULK desactiva check llaves foraneas.

No modifica la BASE DE DATOS, en todo caso modifica el constrain de la tabla, lo cambia a NOCHECK
__________________
MCTS Isaias Islas
  #6 (permalink)  
Antiguo 02/12/2014, 12:38
 
Fecha de Ingreso: mayo-2005
Mensajes: 103
Antigüedad: 19 años, 7 meses
Puntos: 2
Respuesta: BULK desactiva check llaves foraneas.

Ok, pero no quiero que modifique los constraint.
¿Que debo hacer?

busco en la internet, y no encuentro nada que haga referencia a mi problema.

gracias.
  #7 (permalink)  
Antiguo 02/12/2014, 12:46
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 4 meses
Puntos: 774
Respuesta: BULK desactiva check llaves foraneas.

por eso se recomienda usar una tabla stage para las inserciones masivas......pregunta, que sintaxis estas usando para el bulk insert???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 02/12/2014 a las 12:51
  #8 (permalink)  
Antiguo 02/12/2014, 13:23
 
Fecha de Ingreso: mayo-2005
Mensajes: 103
Antigüedad: 19 años, 7 meses
Puntos: 2
Respuesta: BULK desactiva check llaves foraneas.

Estaba usando BULK INSERT. Despues de revisar por este foro y con la ayuda de gnzsoloyo estoy usando el BULK INSERT CHECKCONSTRAINT que me esta validando la información.
Es un poco mas lenta, pero lo hace.

El problema es lo que habia comentado despues, Que cambia WITH CHECK ADD CONSTRAINT por WITH NOCHECK ADD CONSTRAINT.

Para mi eso es extraño. :S
  #9 (permalink)  
Antiguo 02/12/2014, 13:35
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 4 meses
Puntos: 774
Respuesta: BULK desactiva check llaves foraneas.

cual es el query que estas usando, podrias por favor poner tu query
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #10 (permalink)  
Antiguo 02/12/2014, 14:57
 
Fecha de Ingreso: mayo-2005
Mensajes: 103
Antigüedad: 19 años, 7 meses
Puntos: 2
Respuesta: BULK desactiva check llaves foraneas.

BULK
INSERT video.dbo.cliente
FROM 'C:\cli\cliente.TXT'--Ruta del archivo
WITH
( CHECK_CONSTRAINTS,
FIELDTERMINATOR = ',', --separa campos
ROWTERMINATOR = '\n' ) --separa filas
GO
  #11 (permalink)  
Antiguo 02/12/2014, 15:25
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 4 meses
Puntos: 774
Respuesta: BULK desactiva check llaves foraneas.

no encontre el porque el bulk insert hace lo que hace, pero si como puedes solucionarlo:

Código SQL:
Ver original
  1. Run This :
  2. //FOR disable ALL CONSTRAINT OF your ALL TABLES
  3. EXEC sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
  4. //Your INSERT query here ......................
  5. //After INSERT Enable ALL the CONSTRAINT
  6. EXEC sp_MSforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL'

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #12 (permalink)  
Antiguo 02/12/2014, 15:31
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 5 meses
Puntos: 180
Respuesta: BULK desactiva check llaves foraneas.

huffffff y si solo ocupa una tabla ?????, creo que debería darnos mas datos al respecto, la idea que tu proporcionas, no se me hace nada descabellada, utilizar tablas tipo stage o de paso.
__________________
MCTS Isaias Islas
  #13 (permalink)  
Antiguo 03/12/2014, 06:15
 
Fecha de Ingreso: mayo-2005
Mensajes: 103
Antigüedad: 19 años, 7 meses
Puntos: 2
Respuesta: BULK desactiva check llaves foraneas.

Hola.

Tengo unos SP, que me podria ayudar a la carga de datos sin modificar los constraint.
Es un SP por cada tabla y son 40. Como podria ejecutar estos 40 sp con un solo comando o un .bat

Los estoy ejecutando de esta forma por cmd.
Código BASH:
Ver original
  1. sqlcmd -s servidor -d base -q "exec SP @RUTA_ARCHIVO='C:\xx.txt', @RUTA_FORMATO='C:\xx.xml';"

si los escribo todos juntos en el SQL SMS no hace nada.

saludos.

Última edición por gnzsoloyo; 03/12/2014 a las 07:16
  #14 (permalink)  
Antiguo 03/12/2014, 10:50
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 5 meses
Puntos: 180
Respuesta: BULK desactiva check llaves foraneas.

Cambio de idea: Como dice mi buen Libras, sube la información a tablas de tipo staging, simple !!
__________________
MCTS Isaias Islas

Etiquetas: bulk, llaves, server, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:23.