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:
Mostrar la cita
#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:
Mostrar la cita
#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:
Mostrar la cita
#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:
Mostrar la cita
#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:
Mostrar la cita
Ads by Google
Search Busqueda sugerida