Mindflux: Sicherheit, Datenintegrität und Navigation härten
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
-- Datenintegrität: E-Mail eindeutig (case-insensitiv) und referenzielle Integrität
|
||||
-- für Scores/Achievements. Verwaiste Altdaten werden vorher bereinigt.
|
||||
|
||||
-- 1) E-Mail-Dubletten auflösen: Die älteste Zeile behält die Adresse, spätere verlieren sie.
|
||||
UPDATE users u
|
||||
SET email = NULL
|
||||
WHERE u.email IS NOT NULL
|
||||
AND EXISTS (
|
||||
SELECT 1 FROM users o
|
||||
WHERE o.email IS NOT NULL
|
||||
AND lower(o.email) = lower(u.email)
|
||||
AND o.id < u.id
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX uq_users_email_lower ON users (lower(email)) WHERE email IS NOT NULL;
|
||||
|
||||
-- 2) Verwaiste Spielstände/Achievements entfernen (stammen aus Zeiten ohne FK).
|
||||
DELETE FROM game_scores WHERE username NOT IN (SELECT username FROM users);
|
||||
DELETE FROM achievements WHERE username IS NOT NULL AND username NOT IN (SELECT username FROM users);
|
||||
|
||||
-- 3) Referenzielle Integrität: Löschen räumt Daten mit ab, Umbenennen zieht sie mit um.
|
||||
ALTER TABLE game_scores
|
||||
ADD CONSTRAINT fk_game_scores_user
|
||||
FOREIGN KEY (username) REFERENCES users (username)
|
||||
ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
ALTER TABLE achievements
|
||||
ADD CONSTRAINT fk_achievements_user
|
||||
FOREIGN KEY (username) REFERENCES users (username)
|
||||
ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
@@ -0,0 +1,6 @@
|
||||
-- Benutzernamen case-insensitiv eindeutig machen: Die App prüft bei Login und
|
||||
-- Registrierung ignoreCase, die DB kannte bisher nur ein case-sensitives UNIQUE.
|
||||
-- Damit ist auch das Check-then-Insert-Race der Registrierung abgesichert.
|
||||
-- Voraussetzung: Es existieren keine Bestandsnamen, die sich nur in der
|
||||
-- Groß-/Kleinschreibung unterscheiden (sonst vorher manuell bereinigen).
|
||||
CREATE UNIQUE INDEX uq_users_username_lower ON users (lower(username));
|
||||
Reference in New Issue
Block a user