Deshabilitar IR para introducción de datos.

11/04/2007 - 12:36 por José Luis | Informe spam
Hola a todos,

estoy realizando el traspaso de una base de datos dbf a SQL Server Express
2005. Tengo toda la estructura ya creada en SQL Server y ahora quisiera
realizar el traspaso de los datos. El problema que tengo es que no se como
desactivar la integridad referencial en SQL Server para poder introducir los
datos y luego volver a activarla.

¿Esto se puede hacer y si se puede alguien me podría ayudar diciéndome cómo?

Muchas gracias por anticipado.

Un saludo,
José Luis.

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
11/04/2007 - 15:12 | Informe spam
José Luis,

Debes recorrer todas las restricciones de clave foranea y dinamicamente
armar usar una sentencia "alter table" para deshabilitar estas restricciones.
Puedes hacer uso de la vista "sys.foreign_keys".

select
object_name(parent_object_id) as table_name,
[name] as fk_constraint_name
from
sys.foreign_keys

Recuerda habilitarlas despues de cargar la data. Puedes habilitarlas sin
chequear integridad (no recomendado) o chequeando integridad para ver si
alguna fila no cumple con la restriccion.


AMB

"José Luis" wrote:

Hola a todos,

estoy realizando el traspaso de una base de datos dbf a SQL Server Express
2005. Tengo toda la estructura ya creada en SQL Server y ahora quisiera
realizar el traspaso de los datos. El problema que tengo es que no se como
desactivar la integridad referencial en SQL Server para poder introducir los
datos y luego volver a activarla.

¿Esto se puede hacer y si se puede alguien me podría ayudar diciéndome cómo?

Muchas gracias por anticipado.

Un saludo,
José Luis.




Respuesta Responder a este mensaje
#2 José Luis
11/04/2007 - 15:58 | Informe spam
Buenas Alejandro,

muchas gracias por responder a mi pregunta. La verdad es que voy empezando
en el manejo de SQL Server y aunque entiendo lo que me dices no tengo ni
idea de como cogerlo... sabes de algún artículo que me pueda valer de
ejemplo para realizar esta operación? o si el asunto no es muy complicado
indicarme tu más o menos como realizarlo.

Muchas gracias de nuevo.

Un saludo,
José Luis.

Muchas gracias por tu ayuda de nuevo.
"Alejandro Mesa" escribió en el
mensaje news:
José Luis,

Debes recorrer todas las restricciones de clave foranea y dinamicamente
armar usar una sentencia "alter table" para deshabilitar estas
restricciones.
Puedes hacer uso de la vista "sys.foreign_keys".

select
object_name(parent_object_id) as table_name,
[name] as fk_constraint_name
from
sys.foreign_keys

Recuerda habilitarlas despues de cargar la data. Puedes habilitarlas sin
chequear integridad (no recomendado) o chequeando integridad para ver si
alguna fila no cumple con la restriccion.


AMB

"José Luis" wrote:

Hola a todos,

estoy realizando el traspaso de una base de datos dbf a SQL Server
Express
2005. Tengo toda la estructura ya creada en SQL Server y ahora quisiera
realizar el traspaso de los datos. El problema que tengo es que no se
como
desactivar la integridad referencial en SQL Server para poder introducir
los
datos y luego volver a activarla.

¿Esto se puede hacer y si se puede alguien me podría ayudar diciéndome
cómo?

Muchas gracias por anticipado.

Un saludo,
José Luis.







Respuesta Responder a este mensaje
#3 Alejandro Mesa
11/04/2007 - 16:40 | Informe spam
José Luis,

Pues esto es un buen ejercicio para aprender. El sgte script generara las
sentencias "alter table ..." para deshabilitar todas las restricciones de
clave primaria.
Para habilitarlas debes comentar la linea "set @sql = ..." y quitar el
comentario de la linea que esta a continuacion de esta. Si durante el proceso
de insertar, se inserto alguna fila que no cumple con la restriccion de clave
foranea, entonces SQL Server dara error cuando trates de habilitar la
restriccion de clave foranea, al menos que la habilites de manera no
confiable "WITH NOCHECK CHECK ..." y uses el comando "dbcc checkconstraints"
para chequear integridad de las mismas y poder reportar, arrepglar y/o
eliminar estas filas. Una vez que hallas detectado y arreglado los errores,
te recomiendo entonces habilitar estas restricciones de manera confiable
"WITH CHECK CHECK ..." ya que SQL Server usa estas restricciones durante la
creacion del plan de ejecucion de sentencias "select" si es que estas
restricciones son confiables.

use [tu_db]
go

declare @sql nvarchar(4000)
declare @cn sysname
declare @ts sysname
declare @tn sysname

declare c cursor
local
fast_forward
for
select
schema_name([schema_id]) as table_schema,
object_name(parent_object_id) as table_name,
[name] as fk_constraint_name
from
sys.foreign_keys

open c

while 1 = 1
begin
fetch from c into @ts, @tn, @cn

if @@error != 0 or @@fetch_status != 0 break

set @sql = N'ALTER TABLE [' + @ts + N'].[' + @tn + N'] NOCHECK CONSTRAINT
[' + @cn + N']'
CONSTRAINT [' + @cn + N']'

exec dbo.sp_executesql @sql
end

close c
deallocate c
GO


AMB

"José Luis" wrote:

Buenas Alejandro,

muchas gracias por responder a mi pregunta. La verdad es que voy empezando
en el manejo de SQL Server y aunque entiendo lo que me dices no tengo ni
idea de como cogerlo... sabes de algún artículo que me pueda valer de
ejemplo para realizar esta operación? o si el asunto no es muy complicado
indicarme tu más o menos como realizarlo.

Muchas gracias de nuevo.

Un saludo,
José Luis.

Muchas gracias por tu ayuda de nuevo.
"Alejandro Mesa" escribió en el
mensaje news:
> José Luis,
>
> Debes recorrer todas las restricciones de clave foranea y dinamicamente
> armar usar una sentencia "alter table" para deshabilitar estas
> restricciones.
> Puedes hacer uso de la vista "sys.foreign_keys".
>
> select
> object_name(parent_object_id) as table_name,
> [name] as fk_constraint_name
> from
> sys.foreign_keys
>
> Recuerda habilitarlas despues de cargar la data. Puedes habilitarlas sin
> chequear integridad (no recomendado) o chequeando integridad para ver si
> alguna fila no cumple con la restriccion.
>
>
> AMB
>
> "José Luis" wrote:
>
>> Hola a todos,
>>
>> estoy realizando el traspaso de una base de datos dbf a SQL Server
>> Express
>> 2005. Tengo toda la estructura ya creada en SQL Server y ahora quisiera
>> realizar el traspaso de los datos. El problema que tengo es que no se
>> como
>> desactivar la integridad referencial en SQL Server para poder introducir
>> los
>> datos y luego volver a activarla.
>>
>> ¿Esto se puede hacer y si se puede alguien me podría ayudar diciéndome
>> cómo?
>>
>> Muchas gracias por anticipado.
>>
>> Un saludo,
>> José Luis.
>>
>>
>>
>>
>




Respuesta Responder a este mensaje
#4 José Luis
12/04/2007 - 12:22 | Informe spam
Hola Alejandro,

muchísimas gracias por el código, voy a probarlo en seguida para ver si
puedo dar por finalizada la importación. Otra cosa será entender el código
:) ,sobre TransactSQL ando un perdido. Me puedes recomendar algún libro o
lugar web para poder ir aprendiendo a crear procedimientos como el que me
has mandado?

Muchas gracias de nuevo por tu ayuda Alejandro.

Un saludo,
José Luis.

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

Pues esto es un buen ejercicio para aprender. El sgte script generara las
sentencias "alter table ..." para deshabilitar todas las restricciones de
clave primaria.
Para habilitarlas debes comentar la linea "set @sql = ..." y quitar el
comentario de la linea que esta a continuacion de esta. Si durante el
proceso
de insertar, se inserto alguna fila que no cumple con la restriccion de
clave
foranea, entonces SQL Server dara error cuando trates de habilitar la
restriccion de clave foranea, al menos que la habilites de manera no
confiable "WITH NOCHECK CHECK ..." y uses el comando "dbcc
checkconstraints"
para chequear integridad de las mismas y poder reportar, arrepglar y/o
eliminar estas filas. Una vez que hallas detectado y arreglado los
errores,
te recomiendo entonces habilitar estas restricciones de manera confiable
"WITH CHECK CHECK ..." ya que SQL Server usa estas restricciones durante
la
creacion del plan de ejecucion de sentencias "select" si es que estas
restricciones son confiables.

use [tu_db]
go

declare @sql nvarchar(4000)
declare @cn sysname
declare @ts sysname
declare @tn sysname

declare c cursor
local
fast_forward
for
select
schema_name([schema_id]) as table_schema,
object_name(parent_object_id) as table_name,
[name] as fk_constraint_name
from
sys.foreign_keys

open c

while 1 = 1
begin
fetch from c into @ts, @tn, @cn

if @@error != 0 or @@fetch_status != 0 break

set @sql = N'ALTER TABLE [' + @ts + N'].[' + @tn + N'] NOCHECK CONSTRAINT
[' + @cn + N']'
CONSTRAINT [' + @cn + N']'

exec dbo.sp_executesql @sql
end

close c
deallocate c
GO


AMB

"José Luis" wrote:

Buenas Alejandro,

muchas gracias por responder a mi pregunta. La verdad es que voy
empezando
en el manejo de SQL Server y aunque entiendo lo que me dices no tengo ni
idea de como cogerlo... sabes de algún artículo que me pueda valer de
ejemplo para realizar esta operación? o si el asunto no es muy complicado
indicarme tu más o menos como realizarlo.

Muchas gracias de nuevo.

Un saludo,
José Luis.

Muchas gracias por tu ayuda de nuevo.
"Alejandro Mesa" escribió en el
mensaje news:
> José Luis,
>
> Debes recorrer todas las restricciones de clave foranea y dinamicamente
> armar usar una sentencia "alter table" para deshabilitar estas
> restricciones.
> Puedes hacer uso de la vista "sys.foreign_keys".
>
> select
> object_name(parent_object_id) as table_name,
> [name] as fk_constraint_name
> from
> sys.foreign_keys
>
> Recuerda habilitarlas despues de cargar la data. Puedes habilitarlas
> sin
> chequear integridad (no recomendado) o chequeando integridad para ver
> si
> alguna fila no cumple con la restriccion.
>
>
> AMB
>
> "José Luis" wrote:
>
>> Hola a todos,
>>
>> estoy realizando el traspaso de una base de datos dbf a SQL Server
>> Express
>> 2005. Tengo toda la estructura ya creada en SQL Server y ahora
>> quisiera
>> realizar el traspaso de los datos. El problema que tengo es que no se
>> como
>> desactivar la integridad referencial en SQL Server para poder
>> introducir
>> los
>> datos y luego volver a activarla.
>>
>> ¿Esto se puede hacer y si se puede alguien me podría ayudar diciéndome
>> cómo?
>>
>> Muchas gracias por anticipado.
>>
>> Un saludo,
>> José Luis.
>>
>>
>>
>>
>







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