Integridad referencial con fk ciclica

07/12/2007 - 12:25 por Pablo Roca | Informe spam
Hola tengo una tabla de roles, que un registro puede ser padre de otros.
Está creada asi:

CREATE TABLE [dbo].[roles](
[pk_roles_id] [int] IDENTITY(1,1) NOT NULL,
[nombre] [varchar](30) NOT NULL CONSTRAINT [df_roles_nombre] DEFAULT (''),
[fk_pk_roles_id] [int] NULL,
CONSTRAINT [pk_roles_id] PRIMARY KEY CLUSTERED
(
[pk_roles_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY =
OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[roles] WITH CHECK ADD CONSTRAINT [fk_roles_roles_id]
FOREIGN KEY([fk_pk_roles_id])
REFERENCES [dbo].[roles] ([pk_roles_id])
GO
ALTER TABLE [dbo].[roles] CHECK CONSTRAINT [fk_roles_roles_id]

Si me voy a modificar la relacion, no me deja modificar las reglas de
actualizazion ni eliminacion . Queria ponerlas en cascada.

Alguna pista en lo que tengo mal diseñado o que debo poner?


Saludos,

Pablo Roca
La Coruna - Spain
http://www.portalfox.com

Preguntas similare

Leer las respuestas

#6 Pablo Roca
07/12/2007 - 18:51 | Informe spam
Ya .. lo tengo en sin acción ...

El problema es que si me pasa esto

pk_roles_id nombre fk_pk_roles_id

1 PADRE1 NULL
2 HIJO1 1
3 HIJO2 1

Cuando borre PADRE1, quiero que se borren HIJO1 e HIJO2

Pienso entonces que deberia hacerlo con un trigger de borrado. ¿Cierto?


Saludos,

Pablo Roca
La Coruna - Spain
http://www.portalfox.com
Respuesta Responder a este mensaje
#7 Pablo Roca
07/12/2007 - 19:33 | Informe spam
Bueno.

Lo arreglé de esta manera:

1. Le quite la relacion de Foreign Key
2. Le puse un trigger de borrado

DELETE FROM [dbo].[roles] WHERE fk_pk_roles_id IN (SELECT pk_roles_id FROM
deleted)

Y funciona perfecto!

Me molesta un poco que no se vea la relación ciclica en el organigrama, pero
si la dejo me daba error al borrar.


Saludos,

Pablo Roca
La Coruna - Spain
http://www.portalfox.com
Respuesta Responder a este mensaje
#8 Alejandro Mesa
07/12/2007 - 19:45 | Informe spam
Hola Pablo,

Yo preferiria dejar la restriccion de clave foranea y usar un procedimineto
para borrado. Si usas SS 2005, puedes usar una CTE recursiva.


AMB

"Pablo Roca" wrote:

Bueno.

Lo arreglé de esta manera:

1. Le quite la relacion de Foreign Key
2. Le puse un trigger de borrado

DELETE FROM [dbo].[roles] WHERE fk_pk_roles_id IN (SELECT pk_roles_id FROM
deleted)

Y funciona perfecto!

Me molesta un poco que no se vea la relación ciclica en el organigrama, pero
si la dejo me daba error al borrar.


Saludos,

Pablo Roca
La Coruna - Spain
http://www.portalfox.com



Respuesta Responder a este mensaje
#9 Gux (MVP)
07/12/2007 - 19:47 | Informe spam
Como ahora no está la relación FK imagino que también necesitará trigger de
INSERT/UPDATE de forma que cuando se ponga un valor no nulo se valide que
exista un valor padre para el valor que se inserta/modifica.

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/profile/gux
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Pablo Roca" wrote:

Bueno.

Lo arreglé de esta manera:

1. Le quite la relacion de Foreign Key
2. Le puse un trigger de borrado

DELETE FROM [dbo].[roles] WHERE fk_pk_roles_id IN (SELECT pk_roles_id FROM
deleted)

Y funciona perfecto!

Me molesta un poco que no se vea la relación ciclica en el organigrama, pero
si la dejo me daba error al borrar.


Saludos,

Pablo Roca
La Coruna - Spain
http://www.portalfox.com



Respuesta Responder a este mensaje
#10 Pablo Roca
07/12/2007 - 19:49 | Informe spam
Bueno .. ahora lo cambié un poco mas

1. Le prohibi valores null en el campo fk_pk_roles_id
2. Le añadi una restriccion de 0 como valor por defecto al mismo campo
3. modificado el trigger de borrado para que cuando no sea un elemento padre
que no haga la segunda select

DELETE FROM [dbo].[roles] WHERE fk_pk_roles_id = 0 AND fk_pk_roles_id IN
(SELECT pk_roles_id FROM deleted)


Saludos,

Pablo Roca
La Coruna - Spain
http://www.portalfox.com
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida