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

#1 Maxi
07/12/2007 - 15:45 | Informe spam
Pablo, intentaste hacerlo con Alter table?


-
Microsoft M.V.P en SQLServer
SQLTotal Consulting - Servicios en SQLServer
Email:
"Pablo Roca" escribió en el mensaje
news:
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

Respuesta Responder a este mensaje
#2 Alejandro Mesa
07/12/2007 - 16:24 | Informe spam
Hola Pablo,

En ese caso SQL Server no te deja usar CASCADE, indicando que esa accion
puede causar ciclos o multiples caminos de cascada. Te tocara simular esa
facilidad de forma procedural. Lo mismo pasa cuando una tabla referencia mas
de una vez a otra tabla.

Ejemplo:

create table dbo.t1 (
c1 int not null primary key
)
go

create table dbo.t2 (
c1 int not null primary key,
c2 int null refrences dbo.t1(c1) on delete cascade,
c3 int null refrences dbo.t1(c1) on delete cascade
)
go

drop table dbo.t1
go


AMB

"Pablo Roca" wrote:

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



Respuesta Responder a este mensaje
#3 Gux (MVP)
07/12/2007 - 16:25 | Informe spam
Use ALTER TABLE REFERENCES ON DELETE|UPDATE NO ACTION.

Si intenta usar ON DELETE|UPDATE en una referencia circular como la que
usted tiene en su tabla, recibirá el mensaje de error 1785:

Msg 1785, Level 16, State 0, Line 1
Introducing FOREIGN KEY constraint 'fk_roles_roles_id' on table 'roles' may
cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON
UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Msg 1750, Level 16, State 0, Line 1
Could not create constraint. See previous errors.

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:

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



Respuesta Responder a este mensaje
#4 Pablo Roca
07/12/2007 - 18:49 | Informe spam
Si .. y tampoco.


Saludos,

Pablo Roca
La Coruna - Spain
http://www.portalfox.com
Respuesta Responder a este mensaje
#5 Pablo Roca
07/12/2007 - 18:49 | Informe spam
Entonces .. con un trigger de borrado?


Saludos,

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