-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathrightmanagement.sql
148 lines (127 loc) · 5.55 KB
/
rightmanagement.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
-- CREATE DATABASE nur für SQL Server
-- USE master
-- DROP DATABASE Groupmembers
-- CREATE DATABASE Groupmembers
-- USE Groupmembers
-- GO
-- *************************************************************************************************
-- TEIL 1: Gruppen als eigene Tabellen
-- *************************************************************************************************
CREATE TABLE Abteilung (
AbteilungId INTEGER PRIMARY KEY,
Name VARCHAR(200) NOT NULL,
CanEdit INTEGER
);
CREATE TABLE Klasse (
KlasseId INTEGER PRIMARY KEY,
Abteilung INTEGER NOT NULL REFERENCES Abteilung(AbteilungId),
Name VARCHAR(200) NOT NULL,
CanEdit INTEGER
);
CREATE TABLE Schueler (
SchuelerId INTEGER PRIMARY KEY,
Firstname VARCHAR(200) NOT NULL,
Lastname VARCHAR(200) NOT NULL,
Klasse INTEGER NOT NULL REFERENCES Klasse(KlasseId),
CanEdit INTEGER
);
-- Abteilungsgruppen anlegen
INSERT INTO Abteilung VALUES (1100, 'Informatik Abend', NULL);
INSERT INTO Abteilung VALUES (2100, 'Wirtschaftsingenieur', 0);
-- Klassengruppen anlegen
INSERT INTO Klasse VALUES (1110, 1100, '2AKIF', NULL);
INSERT INTO Klasse VALUES (1120, 1100, '2BKIF', 1);
INSERT INTO Klasse VALUES (2110, 2100, '1AHWIT', NULL);
INSERT INTO Klasse VALUES (2120, 2100, '2AHWIT', 1);
-- Schüler anlegen
-- 2AKIF
insert into Schueler values (1000, 'Selig', 'Grabiec', 1110, NULL);
insert into Schueler values (1001, 'Bee', 'Apted', 1110, 1);
-- 2BKIF
insert into Schueler values (1002, 'Hiram', 'Ramsted', 1120, NULL);
insert into Schueler values (1003, 'Jeth', 'Lewknor', 1120, NULL);
-- 1AHWIT
insert into Schueler values (1004, 'Garrick', 'Trusdale', 2110, NULL);
insert into Schueler values (1005, 'Velvet', 'Adshed', 2110, NULL);
-- 2AHWIT
insert into Schueler values (1006, 'Kennan', 'Imloch', 2120, NULL);
insert into Schueler values (1007, 'Mitchell', 'Rearden', 2120, 0);
-- Welche effektiven Rechte haben die Schüler?
SELECT a.Name AS Abt, k.Name AS Klasse, s.Firstname, s.Lastname,
a.CanEdit AS CanEditAbt,
k.CanEdit AS CanEditKlasse,
s.CanEdit AS CanEditSchueler,
COALESCE(s.CanEdit, k.CanEdit, a.CanEdit, 0) AS EffectiveEdit
FROM Abteilung a INNER JOIN Klasse k ON (a.AbteilungId = k.Abteilung)
INNER JOIN Schueler s ON (k.KlasseId = s.Klasse)
ORDER BY a.Name, k.Name, s.Lastname;
-- *************************************************************************************************
-- TEIL 2: Lösung mit einer allgemeinen Gruppentabelle
-- *************************************************************************************************
CREATE TABLE AppGroup (
GroupId INTEGER PRIMARY KEY,
ParentGroup INTEGER REFERENCES AppGroup(GroupId),
Name VARCHAR(200) NOT NULL,
CanEdit INTEGER
);
CREATE TABLE Person (
PersonId INTEGER PRIMARY KEY,
Firstname VARCHAR(200) NOT NULL,
Lastname VARCHAR(200) NOT NULL,
AppGroup INTEGER NOT NULL REFERENCES AppGroup(GroupId),
CanEdit INTEGER
);
-- Die Gruppen und ihre Hierarchien aufbauen.
INSERT INTO AppGroup VALUES (1000, NULL, 'Studierende', NULL);
INSERT INTO AppGroup VALUES (1100, 1000, 'Informatik Abend', NULL);
INSERT INTO AppGroup VALUES (1110, 1100, '2AKIF', NULL);
INSERT INTO AppGroup VALUES (1120, 1100, '2BKIF', 1);
INSERT INTO AppGroup VALUES (2100, 1000, 'Wirtschaftsingenieur', 0);
INSERT INTO AppGroup VALUES (2110, 2100, '1AHWIT', NULL);
INSERT INTO AppGroup VALUES (2120, 2100, '2AHWIT', 1);
INSERT INTO AppGroup VALUES (2000, NULL, 'Lehrende', 1);
INSERT INTO AppGroup VALUES (2200, 2000, 'Karenziert', 0);
-- Schüler eintragen.
-- 2AKIF
insert into Person values (1000, 'Selig', 'Grabiec', 1110, NULL);
insert into Person values (1001, 'Bee', 'Apted', 1110, 1);
-- 2BKIF
insert into Person values (1002, 'Hiram', 'Ramsted', 1120, NULL);
insert into Person values (1003, 'Jeth', 'Lewknor', 1120, NULL);
-- 1AHWIT
insert into Person values (1004, 'Garrick', 'Trusdale', 2110, NULL);
insert into Person values (1005, 'Velvet', 'Adshed', 2110, NULL);
-- 2AHWIT
insert into Person values (1006, 'Kennan', 'Imloch', 2120, NULL);
insert into Person values (1007, 'Mitchell', 'Rearden', 2120, 0);
-- Lehrer eintragen.
insert into Person values (2000, 'Kristofer', 'Kitchingman', 2000, NULL);
insert into Person values (2001, 'Filberto', 'Brettor', 2000, NULL);
-- Karenzierte Lehrer
insert into Person values (2002, 'Tamma', 'McTeague', 2200, NULL);
-- Effektive Rechte, max. 3 Ebenen
SELECT p.Lastname, p.Firstname,
p.CanEdit AS EditFromPerson,
g1.Name AS Group1, g1.CanEdit AS EditFromGroup1,
g2.Name AS Group2, g2.CanEdit AS EditFromGroup2,
g3.Name AS Group3, g3.CanEdit AS EditFromGroup3,
COALESCE(p.CanEdit, g1.CanEdit, g2.CanEdit, g3.CanEdit, 0) AS EffectiveEdit
FROM Person p LEFT JOIN AppGroup g1 ON (p.AppGroup = g1.GroupId)
LEFT JOIN AppGroup g2 ON (g1.ParentGroup = g2.GroupId)
LEFT JOIN AppGroup g3 ON (g2.ParentGroup = g3.GroupId);
-- Zusatzinfo: Rekursives SQL
WITH RightsCTE AS
(
SELECT p.PersonId, p.Lastname, p.Firstname,
g.GroupId, g.Name, g.ParentGroup,
COALESCE(p.CanEdit, g.CanEdit) AS CanEdit
FROM Person p INNER JOIN AppGroup g ON (p.AppGroup = g.GroupId)
UNION ALL
SELECT
r.PersonId, r.Lastname, r.Firstname,
g1.GroupId, g1.Name, g1.ParentGroup, -- Hier werden Daten der parent group ausgegeben.
COALESCE(r.CanEdit, g1.CanEdit) -- Effekive Rechte berechnen, wenn wir die Hierarchie hinauf gehen.
-- Join zwischen der eigenen CTE Tabelle und der neuen Gruppe
FROM RightsCTE r INNER JOIN AppGroup g1 ON (r.ParentGroup = g1.GroupId)
)
SELECT * FROM RightsCTE WHERE ParentGroup IS NULL;