In relationalen Datenbanken sollten diese in mehrere Relationen aufgebrochen werden:
// MMIMS-Unix-Strukturen
CREATE TABLE passwd
(
login VARCHAR(16) KEY,
pwd CHAR(15),
uid FIXED(6,0) UNIQUE NOT NULL,
gid FIXED(6,0),
gcos VARCHAR(80),
home VARCHAR(30),
shell VARCHAR(30),
status CHAR(1) ,
aendtaeter CHAR(15),
aendzeit TIMESTAMP
);
// CONSTRAINT status IN ('N','A','K')
CREATE TABLE ugroup
(
gname VARCHAR(16) KEY,
gid FIXED(6,0) UNIQUE NOT NULL,
passwd VARCHAR(15)
);
//
CREATE TABLE ugroupmembers
(
login VARCHAR(16),
gname VARCHAR(16),
FOREIGN KEY(login) REFERENCES passwd ON DELETE CASCADE,
FOREIGN KEY(gname) REFERENCES ugroup
ON DELETE CASCADE
);
Mit den folgenden zugehörigen DB-Prozeduren wird die Gruppenzeile richtig
zusammengebaut:
DBPROC MG.GETGROUP PARMS ( IN gruppe VARCHAR(15), OUT erg VARCHAR(256) );
SQL ( SELECT gname,passwd,gid INTO :@gname,:@passwd,:@gid
FROM "MDBA"."UGROUP"
WHERE gname=:gruppe );
IF $RC<>0 THEN STOP(100,'Gruppe ' & gruppe & ' nicht gefunden ');
erg := @gname & ':' & @passwd & ':' & @gid & ':';
SQL ( SELECT gm (login) FROM "MDBA"."UGROUPMEMBERS" WHERE gname=:gruppe );
IF $RC = 0 THEN
BEGIN
@i:=0;
SQL ( FETCH FIRST gm INTO :@u );
WHILE $RC=0 DO
BEGIN
IF @i=0 THEN erg := erg & @u
ELSE erg := erg & ',' & @u;
SQL (FETCH NEXT gm INTO :@u );
@i:=@i+1;
END
END;
ENDMODULE
DBPROC MG.GETGROUPUID PARMS ( IN gid FIXED(6,0) , OUT erg VARCHAR(256) );
SQL ( SELECT gname,passwd,gid INTO :@gname,:@passwd,:@gid
FROM "MDBA"."UGROUP"
WHERE gid=:gid );
IF $RC<>0 THEN STOP(100,'BSGruppe ' & gid & ' nicht gefunden ');
erg := @gname & ':' & @passwd & ':' & @gid & ':';
SQL ( SELECT gm (login) FROM "MDBA"."UGROUPMEMBERS" WHERE gname=:@gname );
IF $RC = 0 THEN
BEGIN
@i:=0;
SQL ( FETCH FIRST gm INTO :@u );
WHILE $RC=0 DO
BEGIN
IF @i=0 THEN erg := erg & @u
ELSE erg := erg & ',' & @u;
SQL (FETCH NEXT gm INTO :@u );
@i:=@i+1;
END
END;
ENDMODULE
PROC MG.START
BEGIN
WRITE CLEAR,'Gruppe ?';READ gruppe;
WRITE NL;
CALL DBPROC GETGROUP PARMS (gruppe,erg);
WRITE erg,NL;
WRITE PAUSE;
END
ENDMODULE
PCREATE MG.GETGROUP
PGRANT MG.GETGROUP TO BSAUTH
PCREATE MG.GETGROUPUID
PGRANT MG.GETGROUPUID TO BSAUTH
Leider gelang mir nicht erfolgreich, den gemeinsamen Teil der Prozeduren
in eine extra Prozedur auszulageren und diese dann aufzurufen.