Zum Inhalt springen

Primary Key änderung auf andere Tabelle übertragen


nadine1985

Empfohlene Beiträge

Hallo liebe Community

ich habe folgendes Problem.

Ich soll eine Datenbank mit MSSQL SERVER 2008 erstellen in der es 2 Tabellen gibt.

CREATE DATABASE Uebung1;

USE Uebung1;


CREATE TABLE Produkt (

	PID		char(2)		NOT NULL	Primary Key,

	Artikel	varchar(255)	NOT NULL,

	Anzahl	int			NOT NULL,

);


CREATE TABLE Kauf (

	KID		int		Primary key,

	PID		char(2)	NOT NULL Foreign key references Produkt(PID),

	Preis		float,

	Kunde	varchar(255),

);





INSERT INTO Produkt (PID,Artikel,Anzahl) VALUES ('C1','COMPUTER',0);

INSERT INTO Produkt (PID,Artikel,Anzahl) VALUES ('D2','DRUCKER',0);

INSERT INTO Produkt (PID,Artikel,Anzahl) VALUES ('B1','BEAMER',0);


INSERT INTO Kauf (KID,PID,Preis,Kunde) VALUES (1,'C1',233.20,'Max');

INSERT INTO Kauf (KID,PID,Preis,Kunde) VALUES (2,'B1',320.00,'Paul');

INSERT INTO Kauf (KID,PID,Preis,Kunde) VALUES (3,'D2',99.45,'Max');

INSERT INTO Kauf (KID,PID,Preis,Kunde) VALUES (4,'C1',123.20,'Fritz');

INSERT INTO Kauf (KID,PID,Preis,Kunde) VALUES (5,'D2',100.20,'Egon');

Dieses funktioniert in dieser Form ersteinmal.:) Allerdings wurde uns als weitere Aufgabe gestellt das bei einer Änderung einer PID die Änderung an die andere Tabelle weitergegeben werden soll. Meine Frage hierzu wäre, ob ich mit der Option eines Triggers richtig liege!? Anders kann ich mir zumindest keine Lösung vorstellen. Ich habe bereits folgendes hierzu versucht:
CREATE TRIGGER PID_Update

ON dbo.Produkt

AFTER UPDATE 

	AS 

	DECLARE @NEW_PID CHAR(2)


	SET @NEW_PID = (SELECT PID FROM inserted)


	UPDATE dbo.Produkt

	SET PID = @NEW_PID
Wobei die Erzeugung des Triggers auch wieder funktionierte, allerdings macht entweder A: Der Trigger nicht das was gefordert ist oder B: Ich habe etwas mit den Primary key bzw Foreign Key nicht ganz verstanden denn
UPDATE dbo.Produkt 

SET PID = 'K1'

WHERE PID = 'C1'

gibt mir folgende Fehlermeldung aus:

Meldung 547, Ebene 16, Status 0, Zeile 1

Die UPDATE-Anweisung steht in Konflikt mit der REFERENCE-Einschränkung 'FK__Kauf__PID__108B795B'. Der Konflikt trat in der 'Uebung1'-Datenbank, Tabelle 'dbo.Kauf', column 'PID' auf.

Die Anweisung wurde beendet.

:confused:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

da ist schon mal das DB-Modell falsch. Ein Pk ist immutable - sprich er darf sich nicht ändern. Damit schließt sich die Verwendung eines fachlichen Werts als Pk, wie Du es getan hast, aus.

Verwende als PK eine Nummer, die Du per Sequence füllst, so wie Du es auch schon in der Tabelle KAUF getan hast, ändere den entsprechenden FK-Constraint und fertig. Andere Lösungsmöglichkeiten sind technisch gesehen nicht korrekt.

Dim

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

ich kann Dr.Dimitri da nur zustimmen. Ein Wert der geändert wird ist als PK gänzlich ungeeignet.

Anstatt wie in Oracle eine Sequence zu verwenden (die gibts im SQL Server in diesem Sinn nicht) definierst Du den neuen PK als [iNT IDENTITY(1,1)]. Somit hast du einen PK vom Typ INT welcher sich selbsständig inkrementiert.

Ein Trigger könnte in etwas (nur ein Vorschlag) so aussehen:


CREATE TRIGGER PID_Trigger

   ON  dbo.Produkt

   AFTER UPDATE

AS 

BEGIN

	DECLARE @PIDvorher char(2)

	DECLARE @PIDnachher char(2)

	SELECT @PIDvorher = PID FROM DELETED

	SELECT @PIDnachher = PID FROM INSERTED


	IF(@PIDvorher <> @PIDnachher)

		BEGIN

			UPDATE dbo.Kauf SET PID = @PIDnachher WHERE PID = @PIDvorher

		END		

END

Die PID soll ja nur in der Tabelle Kauf geändert werden wenn sie einen neuen Wert erhalten hat...

Viele Grüße,

Thomas

Link zu diesem Kommentar
Auf anderen Seiten teilen

Noch als Ergänzung: Die PID sollte nur einmalig vorhanden sein und nicht in mehreren Tabellen gepflegt werden. Ansonsten müsste man auch den Rückweg abfangen (also Änderung der PID in KAUF).

Und meine Meinung zum Thema Trigger dürfte hier bekannt sein :D

Dim

PS: Ein PK ist bereits NOT NULL das muss man nicht nochmal definieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...