47 lines
2.0 KiB
SQL
47 lines
2.0 KiB
SQL
-- MijnBesluit - twee mensen mogen dezelfde persoon kennen
|
|
--
|
|
-- Op `persons.email` stond een UNIQUE-index. Dat botste met het uitgangspunt van
|
|
-- docs/Identiteit.md: iedereen heeft zijn EIGEN aantekening over een ander, en die aantekeningen
|
|
-- worden pas één zodra de persoon zelf beide uitnodigingen aanneemt.
|
|
--
|
|
-- Wat er misging: voegde je iemand toe met een e-mailadres dat al ergens in de database stond -
|
|
-- bij wie dan ook, ook bij een wildvreemde - dan liep het opslaan stuk op die index. Voor de
|
|
-- gebruiker was dat een knop die niets deed. En het gevolg was erger dan een foutmelding: wie
|
|
-- het adres van iemand het eerst invulde, bepaalde daarmee dat niemand anders die persoon nog
|
|
-- kon toevoegen. In een applicatie waarin twee ouders allebei hun dochter toevoegen is dat
|
|
-- precies de verkeerde kant om.
|
|
--
|
|
-- Uniek blijft het wél bij `users.email`: één account per e-mailadres. Dat is iets anders dan
|
|
-- een aantekening over iemand, en dat moet uniek blijven, anders weet niemand wie er inlogt.
|
|
--
|
|
-- De index zelf blijft staan, alleen niet meer uniek: er wordt op adres gezocht.
|
|
--
|
|
-- Draaien met:
|
|
-- mysql -u root -p mijnbesluit < db\15_adres_niet_uniek.sql
|
|
--
|
|
-- Opnieuw draaien mag: er gebeurt dan niets.
|
|
|
|
USE `mijnbesluit`;
|
|
|
|
SET @uniek := (
|
|
SELECT COUNT(*) FROM information_schema.STATISTICS
|
|
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'persons'
|
|
AND INDEX_NAME = 'ux_persons_email');
|
|
|
|
SET @sql := IF(@uniek > 0,
|
|
'ALTER TABLE `persons` DROP INDEX `ux_persons_email`',
|
|
'SELECT "ux_persons_email bestaat niet (meer)" AS melding');
|
|
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
|
|
|
SET @gewoon := (
|
|
SELECT COUNT(*) FROM information_schema.STATISTICS
|
|
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'persons'
|
|
AND INDEX_NAME = 'ix_persons_email');
|
|
|
|
SET @sql := IF(@gewoon = 0,
|
|
'ALTER TABLE `persons` ADD INDEX `ix_persons_email` (`email`)',
|
|
'SELECT "ix_persons_email bestaat al" AS melding');
|
|
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
|
|
|
SELECT 'Klaar.' AS melding;
|