Integridad referencial en SQL Server 2005 Express

27/06/2006 - 17:57 por José Luis | Informe spam
Hola a todos,

estoy tratando de crear la integridad referencial de una base de datos de
una aplicación que estoy traspasando a utilizar SQL Server 2005 Express como
base de datos. El problema que tengo es que no se como hacer para que
funcione de la siguiente manera:

dentro de una tabla tengo varios campos que son claves foraneas, lo que
quiero es que sea posbile introducir registros sin que sea necesario dar
valores a estas claves foraneas. Y que la integridad no permita borrar un
campo de la tabla asociada a la clave foránea si este valor esta siendo
utilizado en la tabla principal.

Creo que con un ejemplo estará más claro:

Tabla principal: Tabla 1 Tabla 2

id id_tabla_1 id_tabla_2
fk_tabla_1
fk_tabla_2

Lo que intento hacer es poder introducir un registro en la tabla principal
sin tener que indicar un valor para fk_tabla y que la integridad no me
permita borrar un registro de Tabla 1 ó Tabla 2 que este referenciado en la
Tabla principal.

Alguién sabe si esto se puede hacer y cómo ?

Muchas gracias.

Un saludo,
José Luis.

Preguntas similare

Leer las respuestas

#1 Salvador Ramos
27/06/2006 - 18:13 | Informe spam
Hola,

Lo que estás indicando es la utilización de la integridad referencial
declarativa.
Esto lo puedes hacer sin problema, utilizando por ejemplo alter table ...
foreign key

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL Server y .NET)


" José Luis" <JLB> escribió en el mensaje
news:
Hola a todos,

estoy tratando de crear la integridad referencial de una base de datos de
una aplicación que estoy traspasando a utilizar SQL Server 2005 Express
como base de datos. El problema que tengo es que no se como hacer para que
funcione de la siguiente manera:

dentro de una tabla tengo varios campos que son claves foraneas, lo que
quiero es que sea posbile introducir registros sin que sea necesario dar
valores a estas claves foraneas. Y que la integridad no permita borrar un
campo de la tabla asociada a la clave foránea si este valor esta siendo
utilizado en la tabla principal.

Creo que con un ejemplo estará más claro:

Tabla principal: Tabla 1 Tabla 2

id id_tabla_1 id_tabla_2
fk_tabla_1
fk_tabla_2

Lo que intento hacer es poder introducir un registro en la tabla principal
sin tener que indicar un valor para fk_tabla y que la integridad no me
permita borrar un registro de Tabla 1 ó Tabla 2 que este referenciado en
la Tabla principal.

Alguién sabe si esto se puede hacer y cómo ?

Muchas gracias.

Un saludo,
José Luis.


Respuesta Responder a este mensaje
#2 J.A. García Barceló
27/06/2006 - 18:18 | Informe spam
Creo que precisamente ese es el comportamiento por defecto de cualquier
clave ajena definida a través del SQL Management Studio -> Bases de datos ->
mibasededatos -> Diagramas de bases de datos -> botón derecho, nuevo
diagrama de base de datos

Ahí puedes ir añadiendo tablas y definir relaciones entre ellas pinchando y
arrastrando campos sobre otras tablas.

Por si quieres usar líneas de comandos, la sintaxis sería:

ALTER TABLE [dbo].[TablaPrincipal] WITH CHECK ADD CONSTRAINT
[FK_TablaPrincipal_Tabla1] FOREIGN KEY([fk_tabla_1])
REFERENCES [dbo].[Tabla_1] ([id_tabla_1])

Así sin mas, el campo fk_tabla_1 puede ser nulo si no está definido como NOT
NULL en el CREATE TABLE correspondiente y no podrás borrar un registro de
Tabla1 si algun registro de TablaPrincipal apunta hacia él.

Un saludo.

J.A. García Barceló
http://jagbarcelo.blogspot.com/


" José Luis" <JLB> escribió en el mensaje
news:
Hola a todos,

estoy tratando de crear la integridad referencial de una base de datos de
una aplicación que estoy traspasando a utilizar SQL Server 2005 Express
como base de datos. El problema que tengo es que no se como hacer para que
funcione de la siguiente manera:

dentro de una tabla tengo varios campos que son claves foraneas, lo que
quiero es que sea posbile introducir registros sin que sea necesario dar
valores a estas claves foraneas. Y que la integridad no permita borrar un
campo de la tabla asociada a la clave foránea si este valor esta siendo
utilizado en la tabla principal.

Creo que con un ejemplo estará más claro:

Tabla principal: Tabla 1 Tabla 2

id id_tabla_1 id_tabla_2
fk_tabla_1
fk_tabla_2

Lo que intento hacer es poder introducir un registro en la tabla principal
sin tener que indicar un valor para fk_tabla y que la integridad no me
permita borrar un registro de Tabla 1 ó Tabla 2 que este referenciado en
la Tabla principal.

Alguién sabe si esto se puede hacer y cómo ?

Muchas gracias.

Un saludo,
José Luis.


Respuesta Responder a este mensaje
#3 José Luis
28/06/2006 - 12:13 | Informe spam
Hola a ambos,

antes de nada gracias por responderme, ya que ando bastante perdido en esta
migración y se agradece toda ayuda que pueda recibir.

He estado probando a crear a través del diagrama una relación tal como lo
hace SQL por defecto y me sigue ocurriendo lo que os comentaba
anteriormente. He sacado el código que genera por si me pudieráis decir que
es lo que hago mal. Es el siguiente:

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id =
OBJECT_ID(N'[dbo].[ESM_PROMOCION]') AND type in (N'U'))

BEGIN

CREATE TABLE [dbo].[ESM_PROMOCION](

[ID_PROMOCION] [char](10) NOT NULL CONSTRAINT
[DF__ESM_PROMO__ID_PR__403A8C7D] DEFAULT (''),

[NOMBRE_PROMOCION] [char](50) NOT NULL CONSTRAINT
[DF__ESM_PROMO__NOMBR__412EB0B6] DEFAULT (''),

[FK_ZONA] [char](10) NULL CONSTRAINT [DF__ESM_PROMO__FK_ZO__4222D4EF]
DEFAULT (''),

[FK_PROMOTOR] [char](10) NULL CONSTRAINT [DF__ESM_PROMO__FK_PR__4316F928]
DEFAULT (''),

CONSTRAINT [PK_ESM_PROMOCION] PRIMARY KEY CLUSTERED

(

[ID_PROMOCION] ASC

)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

END

GO

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id =
OBJECT_ID(N'[dbo].[FK_ESM_PROMOCION_ESM_ZONA]') AND parent_object_id =
OBJECT_ID(N'[dbo].[ESM_PROMOCION]'))

ALTER TABLE [dbo].[ESM_PROMOCION] WITH CHECK ADD CONSTRAINT
[FK_ESM_PROMOCION_ESM_ZONA] FOREIGN KEY([FK_ZONA])

REFERENCES [dbo].[ESM_ZONA] ([ID_ZONA])

GO

ALTER TABLE [dbo].[ESM_PROMOCION] CHECK CONSTRAINT
[FK_ESM_PROMOCION_ESM_ZONA]



Muchas gracias de nuevo por vuestra ayuda.

Un saludo,

José Luis.



"J.A. García Barceló" escribió en el mensaje
news:
Creo que precisamente ese es el comportamiento por defecto de cualquier
clave ajena definida a través del SQL Management Studio -> Bases de
datos -> mibasededatos -> Diagramas de bases de datos -> botón derecho,
nuevo diagrama de base de datos

Ahí puedes ir añadiendo tablas y definir relaciones entre ellas pinchando
y arrastrando campos sobre otras tablas.

Por si quieres usar líneas de comandos, la sintaxis sería:

ALTER TABLE [dbo].[TablaPrincipal] WITH CHECK ADD CONSTRAINT
[FK_TablaPrincipal_Tabla1] FOREIGN KEY([fk_tabla_1])
REFERENCES [dbo].[Tabla_1] ([id_tabla_1])

Así sin mas, el campo fk_tabla_1 puede ser nulo si no está definido como
NOT NULL en el CREATE TABLE correspondiente y no podrás borrar un registro
de Tabla1 si algun registro de TablaPrincipal apunta hacia él.

Un saludo.

J.A. García Barceló
http://jagbarcelo.blogspot.com/


" José Luis" <JLB> escribió en el mensaje
news:
Hola a todos,

estoy tratando de crear la integridad referencial de una base de datos de
una aplicación que estoy traspasando a utilizar SQL Server 2005 Express
como base de datos. El problema que tengo es que no se como hacer para
que funcione de la siguiente manera:

dentro de una tabla tengo varios campos que son claves foraneas, lo que
quiero es que sea posbile introducir registros sin que sea necesario dar
valores a estas claves foraneas. Y que la integridad no permita borrar un
campo de la tabla asociada a la clave foránea si este valor esta siendo
utilizado en la tabla principal.

Creo que con un ejemplo estará más claro:

Tabla principal: Tabla 1 Tabla 2

id id_tabla_1 id_tabla_2
fk_tabla_1
fk_tabla_2

Lo que intento hacer es poder introducir un registro en la tabla
principal sin tener que indicar un valor para fk_tabla y que la
integridad no me permita borrar un registro de Tabla 1 ó Tabla 2 que este
referenciado en la Tabla principal.

Alguién sabe si esto se puede hacer y cómo ?

Muchas gracias.

Un saludo,
José Luis.






Respuesta Responder a este mensaje
#4 J.A. García Barceló
28/06/2006 - 12:21 | Informe spam
El problema lo tienes en:

...
[FK_ZONA] [char](10) NULL CONSTRAINT [DF__ESM_PROMO__FK_ZO__4222D4EF]
DEFAULT (''),

[FK_PROMOTOR] [char](10) NULL CONSTRAINT [DF__ESM_PROMO__FK_PR__4316F928]
DEFAULT (''),
...

Por un lado dices que los campos FK_ZONA y FK_PROMOTOR pueden ser NULL pero
luego les das valores por defecto '' (cadena vacía). Si das los valores por
defecto '' (cadena vacía) a las claves ajenas, debe existir '' (cadena
vacía) como clave primaria en un registro de las tablas a las que se hace
referencia. En lugar de usar la cadena vacía, no les pongas valor por
defecto a dichos campos. Tomarán NULL ellos solos. NULL y '' no son la misma
cosa.

Un saludo.

J.A. García Barceló
http://jagbarcelo.blogspot.com/


" José Luis" <JLB> escribió en el mensaje
news:
Hola a ambos,

antes de nada gracias por responderme, ya que ando bastante perdido en
esta migración y se agradece toda ayuda que pueda recibir.

He estado probando a crear a través del diagrama una relación tal como lo
hace SQL por defecto y me sigue ocurriendo lo que os comentaba
anteriormente. He sacado el código que genera por si me pudieráis decir
que es lo que hago mal. Es el siguiente:

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id =
OBJECT_ID(N'[dbo].[ESM_PROMOCION]') AND type in (N'U'))

BEGIN

CREATE TABLE [dbo].[ESM_PROMOCION](

[ID_PROMOCION] [char](10) NOT NULL CONSTRAINT
[DF__ESM_PROMO__ID_PR__403A8C7D] DEFAULT (''),

[NOMBRE_PROMOCION] [char](50) NOT NULL CONSTRAINT
[DF__ESM_PROMO__NOMBR__412EB0B6] DEFAULT (''),

[FK_ZONA] [char](10) NULL CONSTRAINT [DF__ESM_PROMO__FK_ZO__4222D4EF]
DEFAULT (''),

[FK_PROMOTOR] [char](10) NULL CONSTRAINT [DF__ESM_PROMO__FK_PR__4316F928]
DEFAULT (''),

CONSTRAINT [PK_ESM_PROMOCION] PRIMARY KEY CLUSTERED

(

[ID_PROMOCION] ASC

)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

END

GO

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id =
OBJECT_ID(N'[dbo].[FK_ESM_PROMOCION_ESM_ZONA]') AND parent_object_id =
OBJECT_ID(N'[dbo].[ESM_PROMOCION]'))

ALTER TABLE [dbo].[ESM_PROMOCION] WITH CHECK ADD CONSTRAINT
[FK_ESM_PROMOCION_ESM_ZONA] FOREIGN KEY([FK_ZONA])

REFERENCES [dbo].[ESM_ZONA] ([ID_ZONA])

GO

ALTER TABLE [dbo].[ESM_PROMOCION] CHECK CONSTRAINT
[FK_ESM_PROMOCION_ESM_ZONA]



Muchas gracias de nuevo por vuestra ayuda.

Un saludo,

José Luis.



"J.A. García Barceló" escribió en el mensaje
news:
Creo que precisamente ese es el comportamiento por defecto de cualquier
clave ajena definida a través del SQL Management Studio -> Bases de
datos -> mibasededatos -> Diagramas de bases de datos -> botón derecho,
nuevo diagrama de base de datos

Ahí puedes ir añadiendo tablas y definir relaciones entre ellas pinchando
y arrastrando campos sobre otras tablas.

Por si quieres usar líneas de comandos, la sintaxis sería:

ALTER TABLE [dbo].[TablaPrincipal] WITH CHECK ADD CONSTRAINT
[FK_TablaPrincipal_Tabla1] FOREIGN KEY([fk_tabla_1])
REFERENCES [dbo].[Tabla_1] ([id_tabla_1])

Así sin mas, el campo fk_tabla_1 puede ser nulo si no está definido como
NOT NULL en el CREATE TABLE correspondiente y no podrás borrar un
registro de Tabla1 si algun registro de TablaPrincipal apunta hacia él.

Un saludo.

J.A. García Barceló
http://jagbarcelo.blogspot.com/


" José Luis" <JLB> escribió en el mensaje
news:
Hola a todos,

estoy tratando de crear la integridad referencial de una base de datos
de una aplicación que estoy traspasando a utilizar SQL Server 2005
Express como base de datos. El problema que tengo es que no se como
hacer para que funcione de la siguiente manera:

dentro de una tabla tengo varios campos que son claves foraneas, lo que
quiero es que sea posbile introducir registros sin que sea necesario dar
valores a estas claves foraneas. Y que la integridad no permita borrar
un campo de la tabla asociada a la clave foránea si este valor esta
siendo utilizado en la tabla principal.

Creo que con un ejemplo estará más claro:

Tabla principal: Tabla 1 Tabla 2

id id_tabla_1 id_tabla_2
fk_tabla_1
fk_tabla_2

Lo que intento hacer es poder introducir un registro en la tabla
principal sin tener que indicar un valor para fk_tabla y que la
integridad no me permita borrar un registro de Tabla 1 ó Tabla 2 que
este referenciado en la Tabla principal.

Alguién sabe si esto se puede hacer y cómo ?

Muchas gracias.

Un saludo,
José Luis.










Respuesta Responder a este mensaje
#5 José Luis
28/06/2006 - 12:47 | Informe spam
Muchisimas gracias J.A.!!!

En efecto el problema estaba por donde tu decias, con los quebraderos de
cabeza que me ha dado esto seguro que es algo que no se me olvida. Esperemos
que el aprendizaje de SQL Server todo no me vaya así, sino voy a apreder
pero me voy a tener que comprar otra cabeza :)

Un saludo,
José Luis.

"J.A. García Barceló" escribió en el mensaje
news:
El problema lo tienes en:

...
[FK_ZONA] [char](10) NULL CONSTRAINT [DF__ESM_PROMO__FK_ZO__4222D4EF]
DEFAULT (''),

[FK_PROMOTOR] [char](10) NULL CONSTRAINT [DF__ESM_PROMO__FK_PR__4316F928]
DEFAULT (''),
...

Por un lado dices que los campos FK_ZONA y FK_PROMOTOR pueden ser NULL
pero luego les das valores por defecto '' (cadena vacía). Si das los
valores por defecto '' (cadena vacía) a las claves ajenas, debe existir ''
(cadena vacía) como clave primaria en un registro de las tablas a las que
se hace referencia. En lugar de usar la cadena vacía, no les pongas valor
por defecto a dichos campos. Tomarán NULL ellos solos. NULL y '' no son la
misma cosa.

Un saludo.

J.A. García Barceló
http://jagbarcelo.blogspot.com/


" José Luis" <JLB> escribió en el mensaje
news:
Hola a ambos,

antes de nada gracias por responderme, ya que ando bastante perdido en
esta migración y se agradece toda ayuda que pueda recibir.

He estado probando a crear a través del diagrama una relación tal como lo
hace SQL por defecto y me sigue ocurriendo lo que os comentaba
anteriormente. He sacado el código que genera por si me pudieráis decir
que es lo que hago mal. Es el siguiente:

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id =
OBJECT_ID(N'[dbo].[ESM_PROMOCION]') AND type in (N'U'))

BEGIN

CREATE TABLE [dbo].[ESM_PROMOCION](

[ID_PROMOCION] [char](10) NOT NULL CONSTRAINT
[DF__ESM_PROMO__ID_PR__403A8C7D] DEFAULT (''),

[NOMBRE_PROMOCION] [char](50) NOT NULL CONSTRAINT
[DF__ESM_PROMO__NOMBR__412EB0B6] DEFAULT (''),

[FK_ZONA] [char](10) NULL CONSTRAINT [DF__ESM_PROMO__FK_ZO__4222D4EF]
DEFAULT (''),

[FK_PROMOTOR] [char](10) NULL CONSTRAINT [DF__ESM_PROMO__FK_PR__4316F928]
DEFAULT (''),

CONSTRAINT [PK_ESM_PROMOCION] PRIMARY KEY CLUSTERED

(

[ID_PROMOCION] ASC

)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

END

GO

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id =
OBJECT_ID(N'[dbo].[FK_ESM_PROMOCION_ESM_ZONA]') AND parent_object_id =
OBJECT_ID(N'[dbo].[ESM_PROMOCION]'))

ALTER TABLE [dbo].[ESM_PROMOCION] WITH CHECK ADD CONSTRAINT
[FK_ESM_PROMOCION_ESM_ZONA] FOREIGN KEY([FK_ZONA])

REFERENCES [dbo].[ESM_ZONA] ([ID_ZONA])

GO

ALTER TABLE [dbo].[ESM_PROMOCION] CHECK CONSTRAINT
[FK_ESM_PROMOCION_ESM_ZONA]



Muchas gracias de nuevo por vuestra ayuda.

Un saludo,

José Luis.



"J.A. García Barceló" escribió en el mensaje
news:
Creo que precisamente ese es el comportamiento por defecto de cualquier
clave ajena definida a través del SQL Management Studio -> Bases de
datos -> mibasededatos -> Diagramas de bases de datos -> botón derecho,
nuevo diagrama de base de datos

Ahí puedes ir añadiendo tablas y definir relaciones entre ellas
pinchando y arrastrando campos sobre otras tablas.

Por si quieres usar líneas de comandos, la sintaxis sería:

ALTER TABLE [dbo].[TablaPrincipal] WITH CHECK ADD CONSTRAINT
[FK_TablaPrincipal_Tabla1] FOREIGN KEY([fk_tabla_1])
REFERENCES [dbo].[Tabla_1] ([id_tabla_1])

Así sin mas, el campo fk_tabla_1 puede ser nulo si no está definido como
NOT NULL en el CREATE TABLE correspondiente y no podrás borrar un
registro de Tabla1 si algun registro de TablaPrincipal apunta hacia él.

Un saludo.

J.A. García Barceló
http://jagbarcelo.blogspot.com/


" José Luis" <JLB> escribió en el mensaje
news:
Hola a todos,

estoy tratando de crear la integridad referencial de una base de datos
de una aplicación que estoy traspasando a utilizar SQL Server 2005
Express como base de datos. El problema que tengo es que no se como
hacer para que funcione de la siguiente manera:

dentro de una tabla tengo varios campos que son claves foraneas, lo que
quiero es que sea posbile introducir registros sin que sea necesario
dar valores a estas claves foraneas. Y que la integridad no permita
borrar un campo de la tabla asociada a la clave foránea si este valor
esta siendo utilizado en la tabla principal.

Creo que con un ejemplo estará más claro:

Tabla principal: Tabla 1 Tabla 2

id id_tabla_1 id_tabla_2
fk_tabla_1
fk_tabla_2

Lo que intento hacer es poder introducir un registro en la tabla
principal sin tener que indicar un valor para fk_tabla y que la
integridad no me permita borrar un registro de Tabla 1 ó Tabla 2 que
este referenciado en la Tabla principal.

Alguién sabe si esto se puede hacer y cómo ?

Muchas gracias.

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