1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

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

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Pippilotta, 4 Juli 2010.

  1. Pippilotta

    Pippilotta Neuer Benutzer

    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?
     
Die Seite wird geladen...

Diese Seite empfehlen