referentielle integrität - cascade update funktioniert nicht bei mehreren Tabellen

Pippilotta

Neuer Benutzer
Beiträge
1
Hallo allerseits.

Ich benutze MsSQL2008 und möchte Änderungen in einer lookup table in dazu in Relation stehenden anderen lookup tables aktualisieren.


Beispiel:

Die erste Tabelle “Contacts” besteht nur aus einem Feld (nvarchar 50) welches auch den primary key enthält.

hier das CREATE TO script welches ich mit dem manager von Microsoft SQL Server erstellt habe:



USE [TEST]
GO

/****** Object: Table [dbo].[Contacts] Script Date: 07/03/2010 20:10:42 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Contacts](
[Contact_PK] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_Supplier] PRIMARY KEY CLUSTERED
(
[Contact_PK] 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


Dann möchte ich eine zweite Tabelle erstellen, die in der ersten Tabelle “Contacts” nachschlägt.
Die zweite Tabelle heisst “Table1”. Die Felder sind:

Primary key
Field1
Field2
ContactPersonID
ExpertID

Die beiden ID-Felder sind foreign keys welche ich zum primary key in der ersten Tabelle (Contacts) in Relation setzen will.

Die beiden Relationen, welche ich mit dem Manager erstellt habe, heissen: “FK_Table1_ContactPerson” und
“FK_Table1_Expert”

Die CREATE TO scripts für die Tabellen lauten:


USE [TEST]
GO

/****** Object: Table [dbo].[Table1] Script Date: 07/03/2010 20:12:48 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Table1](
[Tablel1_PK] [int] NOT NULL,
[Field1] [real] NULL,
[Field2] [real] NULL,
[ContactPerson_ID] [nvarchar](50) NULL,
[Expert_ID] [nvarchar](50) NULL,
CONSTRAINT [PK_Spareparts] PRIMARY KEY CLUSTERED
(
[Tablel1_PK] 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

ALTER TABLE [dbo].[Table1] WITH CHECK ADD CONSTRAINT [FK_Table1_ContactPerson] FOREIGN KEY

([ContactPerson_ID])
REFERENCES [dbo].[Contacts] ([Contact_PK])
GO

ALTER TABLE [dbo].[Table1] CHECK CONSTRAINT [FK_Table1_ContactPerson]
GO

ALTER TABLE [dbo].[Table1] WITH CHECK ADD CONSTRAINT [FK_Table1_Expert] FOREIGN KEY([Expert_ID])
REFERENCES [dbo].[Contacts] ([Contact_PK])
GO

ALTER TABLE [dbo].[Table1] CHECK CONSTRAINT [FK_Table1_Expert]
GO


Nun möchte ich die referential integrity nutzen, um alle records korrekt zu aktualisieren.


Heisst: wenn ich etwas in “Contacts” ändere, sollen alle Änderungen in den in Relation stehenden ID-Feldern aktualisiert werden. (“ContactPerson” und “Expert”) in der anderen Tabelle “Table1"

Und wenn ich ein Feld in “Contacts” lösche sollen die ID-Felder (“ContactPerson” und “Expert”) in “Table1” zu NULL werden.

Mit dem Manager habe ich folgende Änderungen in der Relationen “FK_Table1_ContactPerson” vorgenommen:

INSERT and UPDATE Specification:

"Delete rule" habe ich zu "Set Null" gesetzt und

"Update rule" zu "Cascade".



USE [TEST]
GO

/****** Object: Table [dbo].[Table1] Script Date: 07/03/2010 20:15:43 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Table1](
[Tablel1_PK] [int] NOT NULL,
[Field1] [real] NULL,
[Field2] [real] NULL,
[ContactPerson_ID] [nvarchar](50) NULL,
[Expert_ID] [nvarchar](50) NULL,
CONSTRAINT [PK_Spareparts] PRIMARY KEY CLUSTERED
(
[Tablel1_PK] 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

ALTER TABLE [dbo].[Table1] WITH CHECK ADD CONSTRAINT [FK_Table1_ContactPerson] FOREIGN KEY

([ContactPerson_ID])
REFERENCES [dbo].[Contacts] ([Contact_PK])
ON UPDATE CASCADE
ON DELETE SET NULL
GO

ALTER TABLE [dbo].[Table1] CHECK CONSTRAINT [FK_Table1_ContactPerson]
GO

ALTER TABLE [dbo].[Table1] WITH CHECK ADD CONSTRAINT [FK_Table1_Expert] FOREIGN KEY([Expert_ID])
REFERENCES [dbo].[Contacts] ([Contact_PK])
GO

ALTER TABLE [dbo].[Table1] CHECK CONSTRAINT [FK_Table1_Expert]
GO


Alle funktionierte bestens, bis ich dieselben Einstellungen in der zweiten Relation
“FK_Table1_Expert” machte:
Delete = NULL
Update = cascade

Dan bekam ich folgende Fehlermeldung:


'Contacts' table saved successfully
'Table1' table
- Unable to create relationship 'FK_Table1_Expert'.
Introducing FOREIGN KEY constraint 'FK_Table1_Expert' on table 'Table1' may cause cycles or multiple cascade
paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint. See previous errors.

Was habe ich falsch gemacht?
 
Werbung:
Zurück
Oben