PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DB2 Foreign Key Problem



element
31.01.2008, 08:02
Guten Tag zusammen,

Ich habe folgendes Problem:

Ich möchte über mehrere DB2 Tabellen eine Userverwaltung mir folgendem SQL aufbauen:

CREATE TABLE USERS (
U_ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 0, INCREMENT BY 1) PRIMARY KEY ,
USERNAME VARCHAR(10) NOT NULL,
NAME VARCHAR(64) NOT NULL,
LOCKED INTEGER NOT NULL
);

CREATE TABLE COMPS (
C_ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 0, INCREMENT BY 1) PRIMARY KEY ,
COMP VARCHAR(3) NOT NULL,
COMPNAME VARCHAR(64) NOT NULL
);
CREATE TABLE GROUPS (
G_ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 0, INCREMENT BY 1) PRIMARY KEY ,
NAME VARCHAR(64) NOT NULL
);

CREATE TABLE PGMS (
P_ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 0, INCREMENT BY 1) PRIMARY KEY ,
CLASS VARCHAR(64) NOT NULL,
NAME VARCHAR(64) NOT NULL,
DIRECTORY VARCHAR(128) NOT NULL,
DESCRIPTION VARCHAR(256) NOT NULL,
PGMCALL VARCHAR(64) NOT NULL,
LOCKED INTEGER NOT NULL
);

CREATE TABLE GROUPPGMS (
ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 0, INCREMENT BY 1) PRIMARY KEY ,
P_ID INTEGER NOT NULL,
G_ID INTEGER NOT NULL,
LOCKED INTEGER NOT NULL,
RW INTEGER NOT NULL,
CONSTRAINT GROUPPGMS_P_ID FOREIGN KEY (P_ID) REFERENCES PGMS (P_ID) ON DELETE CASCADE,
CONSTRAINT GROUPPGMS_G_ID FOREIGN KEY (G_ID) REFERENCES GROUPS (G_ID) ON DELETE CASCADE
);

CREATE TABLE GRPCOMP (
ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 0, INCREMENT BY 1) PRIMARY KEY ,
G_ID INTEGER NOT NULL,
C_ID INTEGER NOT NULL,
CONSTRAINT GRPCOMP_G_ID FOREIGN KEY (G_ID) REFERENCES GROUPS (G_ID) ON DELETE CASCADE,
CONSTRAINT GRPCOMP_C_ID FOREIGN KEY (C_ID) REFERENCES COMPS (C_ID) ON DELETE CASCADE
);

CREATE TABLE USERCOMP (
ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 0, INCREMENT BY 1) PRIMARY KEY ,
C_ID INTEGER NOT NULL,
U_ID INTEGER NOT NULL,
CONSTRAINT USERCOMP_C_ID FOREIGN KEY (C_ID) REFERENCES COMPS (C_ID) ON DELETE CASCADE,
CONSTRAINT USERCOMP_U_ID FOREIGN KEY (U_ID) REFERENCES USERS (U_ID) ON DELETE CASCADE
);

CREATE TABLE USERGRPS (
ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 0, INCREMENT BY 1) PRIMARY KEY ,
U_ID INTEGER NOT NULL,
G_ID INTEGER NOT NULL,
CONSTRAINT USERGRPS_U_ID FOREIGN KEY (U_ID) REFERENCES USERS (U_ID) ON DELETE CASCADE,
CONSTRAINT USERGRPS_G_ID FOREIGN KEY (G_ID) REFERENCES GROUPS (G_ID) ON DELETE CASCADE
);

CREATE TABLE USERPGMS (
ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 0, INCREMENT BY 1) PRIMARY KEY ,
P_ID INTEGER NOT NULL,
U_ID INTEGER NOT NULL,
ACCESS INTEGER NOT NULL,
RW INTEGER NOT NULL,
CONSTRAINT USERPGMS_P_ID FOREIGN KEY (P_ID) REFERENCES PGMS (P_ID) ON DELETE CASCADE,
CONSTRAINT USERPGMS_U_ID FOREIGN KEY (U_ID) REFERENCES USERS (U_ID) ON DELETE CASCADE
);

Nun habe ich folgendes Problem:

Wenn ich in der "USERS" eine Datensatz einfüge mit einem normalen "INSERT INTO ...." kann ich diesen nicht mehr löschen.

Kann mir da vllt. jemand helfen?

mfg element

rdg
31.01.2008, 14:54
ich würd mal sagen das du vorher die Referenzen löschen musste und dann erst den User, sonnst zerschiest du dir gleich deine DB

dort wo:
CONSTRAINT ... REFERENCES USERS (U_ID) ON DELETE CASCADE
steht

element
31.01.2008, 16:33
Ne das glaube ich nciht das das dann ja nciht der Sinn von Referensen ist. Oder sehe ich das flasch? Kann dienen vorschlag leider grade nciht ausprobieren sonst würde ich es testen

rdg
31.01.2008, 16:43
Naja, ohne unhöflich klingen zu wollen, worin siehst du denn den Sinn von Referenzen?

gruß
rdg

warte mal ...

doch ich bleibe dabei, warum sonst Fremdschlüssel mit UID?!
hast mich ganz schön durcheinander gebracht. ;)

http://de.wikipedia.org/wiki/Referenzielle_Integrit%C3%A4t


...Datenbank stellt sicher, dass der Primärschlüssel existiert und nur gemeinsam mit dem Fremdschlüssel geändert oder gelöscht werden kann.

element
04.02.2008, 07:58
...Datenbank stellt sicher, dass der Primärschlüssel existiert und nur gemeinsam mit dem Fremdschlüssel geändert oder gelöscht werden kann.

Genau das war mein Ziel. Nur kann ich keinen Benutzer löschen obwohl in der Detailtabelle keine Daten vorhanden sind.