none
UPDATE auf verknüpfte Tabellen

    Frage

  • Hallo zusammen.

    Ich habe eine MS SQL 2008 R2 DB mit folgenden Tabellen:

    tbl_IP
    IPAdresse     = 141.18.1.11 (PK)
    Kommentar   = NULL

    tbl_GerätIP
    ID                  = 198
    ID_Gerät       = 173
    ID_IPAdresse= 141.18.1.11 (FK auf tbl_IP.IPAdresse)

    Jetzt möchte ich mit

    Update tbl_IPAdresse  
    SET IPAdresse  = '141.018.001.011'
    FROM dbo.tbl_IPAdresse
    WHERE IPAdresse = '141.18.1.11'

    Den Datensatz ändern. Klar das natürlich auch in tbl_GerätIP der Datensatz geändert werden soll. Ich bekomm auch
    eine Fehlermeldung das das nicht geht. Ich habe jetzt mal ein bisschen geschaut und denke es hat vermutlich etwas
    mit UPDATE CASCADE etwas tun muss. Kann mir jemdand sagen ob ich vermutlich etwas an der Tabellendefinition ändern
    muss oder muss ich nur den Update-Befehl erweitern?

    Für jede Antwort bin ich dankbar.

    P.S. Eine dritte Tabelle hat auch einen FK auf die Haupttabelle, habe ich aber mal aus Übersichtsgründen weggelassen.

    Donnerstag, 15. März 2012 15:44

Antworten

  • So...habs erledigt.
    Es war eine falsche Einstellung in der Datenbanktabelle.
    Mit folgendem Code konnte ich dann das erreichen was ich wollte:

    alter table dbo.tbl_GerätIP
    	drop constraint FK_tbl_GerätIP_tbl_IPAdresse
    go
    
    ALTER TABLE [dbo].[tbl_GerätIP]  WITH CHECK ADD  CONSTRAINT [FK_tbl_GerätIP_tbl_IPAdresse] FOREIGN KEY([ID_IPAdresse])
    REFERENCES [dbo].[tbl_IPAdresse] ([IPAdresse])
    on update cascade
    GO

    Danach kann ich jetzt ein Update auf die Tabelle fahren und die verknüpfte Tabelle ändert sich auch:

    Update tbl_IPAdresse  
    SET IPAdresse  = '141.018.253.212'
    
    WHERE IPAdresse = '141.18.253.212'
    
    GO

    Trotzdem Danke Christoph.
    Gruß
    Suschi

    • Als Antwort markiert Onkelsuschi Freitag, 16. März 2012 12:04
    Freitag, 16. März 2012 12:04

Alle Antworten

  • Hallo!
    Ich bin kein Freund von solchen Lösungen, wo über Umwege versucht werden soll, ein Fehler im Design wieder auszubügeln.
    Wenn du den PK ändern willst, ist die eigentlich ein Delete und Insert eines neuen Satzes. Diese kaskadierenden Updates kommen sicherlich aus der Gewohnheit von Access her und können bei großen Datenbanken auch schon mal nach hinten losgehen.
    Übrigens brauchst Du beim Update keine FROM-Klausel, wenn es nur um eine Tabelle geht.

    Also würde ich folgendes machen:
    1.) Insert neuer Satz als Kopie des alten mit geändertem PK
    2.) Update auf abhängige Sätze, damit diese am neuen Satz hängen
    3.) Delete des alten Satzes

    Noch besser wäre hier die Einführung eines beständigen PKs, dies kann z. b. auch ein synthetischer Schlüssel (IDENTITY) sein. Das spart unter Umständen auch Platz in den abhängigen Tabellen, da ein INTEGER-Feld sicherlich kürzer ist als ein varchar(15), welches Du mindestens verwendet hast.
    Auch die Umstellung auf ipv6 ist dann kein Problem mehr, da die PKs alle erhalten bleiben. Hier müssten dann auch keine abhängigen Sätze mehr aktualisiert werden.

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    www.insidesql.org/blogs/cmu

    Freitag, 16. März 2012 07:51
    Beantworter
  • Hallo!
    Vielen Dank für die Antwort. Ich kann für die Erstellung der Tabellen nichts. Wie du schon bemerkt hast geht es um eine Designfrage.
    Es soll ein Bericht erstellt werden bei dem man nach IP-Adresse sortieren kann. Seis drum.

    1.) Insert neuer Satz als Kopie des alten mit geändertem PK
    Ich nehm mal an das ist ein einfacher Insert Into.

    2.) Update auf abhängige Sätze, damit diese am neuen Satz hängen
    Hier häng ich grad ein bisschen. Wie gebe ich an die anderen Tabellen weiter das sich ihr Eintrag geändert hat?
    Ich hab ja schon durch Schritt 1.) alles geändert?

    3.) Delete des alten Satzes
    Kann ich mir auch noch vorstellen.

    Wäre schön wenn Du mir ein bisschen helfen könntest. Vielen Dank auch für den Tipp mit dem INT aber das ist erst mal
    nicht diskutabel.

    mfg
    Suschi

    Freitag, 16. März 2012 08:33
  • Hallo Suschi, das Insert ist ganz einfach:

    Insert into Tabelle(PK, <Feldliste>)
    Select <neuerWert> as PK, <Feldliste>
    from Tabelle
    where PK = <alterWert>;

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    www.insidesql.org/blogs/cmu

    Freitag, 16. März 2012 09:43
    Beantworter
  • Jetzt wird auch das Update klar:

    Update Tabelle2
    Set FK = <neuerWert>
    where FK = <alterWert>;

     Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    www.insidesql.org/blogs/cmu

    Freitag, 16. März 2012 09:44
    Beantworter
  • So...habs erledigt.
    Es war eine falsche Einstellung in der Datenbanktabelle.
    Mit folgendem Code konnte ich dann das erreichen was ich wollte:

    alter table dbo.tbl_GerätIP
    	drop constraint FK_tbl_GerätIP_tbl_IPAdresse
    go
    
    ALTER TABLE [dbo].[tbl_GerätIP]  WITH CHECK ADD  CONSTRAINT [FK_tbl_GerätIP_tbl_IPAdresse] FOREIGN KEY([ID_IPAdresse])
    REFERENCES [dbo].[tbl_IPAdresse] ([IPAdresse])
    on update cascade
    GO

    Danach kann ich jetzt ein Update auf die Tabelle fahren und die verknüpfte Tabelle ändert sich auch:

    Update tbl_IPAdresse  
    SET IPAdresse  = '141.018.253.212'
    
    WHERE IPAdresse = '141.18.253.212'
    
    GO

    Trotzdem Danke Christoph.
    Gruß
    Suschi

    • Als Antwort markiert Onkelsuschi Freitag, 16. März 2012 12:04
    Freitag, 16. März 2012 12:04