Benutzer löschen die noch nie bestellt haben

Wie kann in über SQL Benutzerdaten (Namen, Adresse und alles was dazugehört) löschen, die bei mir noch nie bestellt haben?

Ich habe mal manuell Benutzer im Admin gelöscht…aber das dauert ja ewig!
z.B. waren viele Einträge dabei mit dem Name “test” oder “aaaa” etc.

Einen Newsletter biete ich nicht an - somit sollte es ja auch kein Problem sein, diese Daten zu löschen, oder?

Alle:DELETE FROM oxuser WHERE oxid NOT IN ( SELECT oxuserid FROM oxorder)
Mit Einschränkung (Bsp: Datum): DELETE FROM oxuser WHERE oxid IN ( SELECT oxuserid FROM oxorder WHERE oxorderdate >= ‘2000-01-01 00:00:00′ AND oxorderdate <= ‘2014-10-22 14:04:19′)

Die anderen Tabellen nicht vergessen, wie etwa oxaddress, oxbaskets, oxbasketitems usw. sonst bleiben Datenleichen liegen.

Alles nach dem gleichen Schema, wobei 1. auch als erstes ausgeführt werden muss. Der Rest ist egal.

1. DELETE FROM oxuser WHERE oxid NOT IN ( SELECT oxuserid FROM oxorder)
2. DELETE FROM oxaddress WHERE oxuserid NOT IN ( SELECT oxid FROM oxuser)
3. DELETE FROM oxuserbasket WHERE oxuserid NOT IN ( SELECT oxid FROM oxuser)
4. DELETE FROM oxuserbasketitems WHERE oxbasketid NOT IN ( SELECT oxid FROM oxuserbasket)

ich würde nur die Kunden löschen, die kein Konto angelegt haben:
… and oxpassword = ‘’

Achtung: @rubbercut - das erste DELETE würde auch den admin löschen, wenn der noch bestellt hat

Hier geht’s sicher um die DSGVO. Danach müssen Userdaten nach einer gewissen Zeit gelöscht werden, egal ob mit oder ohne Passwort. Dies kann man mit o.g. Datum realisieren.

naja, wann was nach DSGVO gelöscht werden muss ist nicht ganz klar geregelt.
Und wenn dann geht es ja auch um Daten von Kunden, die auch bestellt haben und auch z.B. um Datenbank-Backups etc.

Ich meine es geht hier einfach um ‘Aufräumen’. Und dabei muss man auf jeden Fall ein Datum mit einbeziehen - z.B. oxtimestamp in oxuser. Denn sonst würde man u.U. Daten eines Kunden löschen der gerade eben im Bestellprozess ist.

1 Like

Kürzen wir das ab: Danach, also ob Kunden mit oder ohne Passwort, wird nicht gefragt.

Ja, das stimmt. Egal mit oder ohne Passwort. Wenn sich nämlich ein Kunde mit Passwort vor Monaten / Jahren registriert hat und dann doch nicht bestellt hat…und ich keinen Newsletter anbiete…warum also diese Daten speichern? Oder gäbe es einen Grund, den ich noch nicht kenne??

Ich fasse zusammen. Ich führe folgende SQL-Anweisungen durch in dieser Reihenfolge (ich wähle die Variante mit Datum):

  1. DELETE FROM oxuser WHERE oxid IN ( SELECT oxuserid FROM oxorder WHERE oxorderdate >= ‘2000-01-01 00:00:00′ AND oxorderdate <= ‘2014-10-22 14:04:19′)

  2. DELETE FROM oxaddress WHERE oxuserid NOT IN ( SELECT oxid FROM oxuser)

  3. DELETE FROM oxuserbasket WHERE oxuserid NOT IN ( SELECT oxid FROM oxuser)

  4. DELETE FROM oxuserbasketitems WHERE oxbasketid NOT IN ( SELECT oxid FROM oxuserbasket)

Muss ich die SQL einzeln aufrufen…und nacheinander ablaufen lassen oder kann ich diese Anweisungen in “einem Abwasch” durchführen.

d.h. Ich lösche nur die Daten von Benutzern, die NICHT bestellt haben in dem eingegeben Zeitraum, oder? Lieber nochmals nachgefragt…

@rubbercut
Du hast alles richtig gelesen und beantwortet! Danke für die schnell Rückmeldung!

Vorsicht: Die Variante mit Datum (wie sie oben steht) ist nur ein Bsp. Hierbei suchst Du nach Einträgen (“IN”), d.h. Du löschst User, die gefunden werden. Im Unterschied dazu arbeiten die anderen mit "NOT IN".

Reihenfolge: Normalerweise werden die Befehle nacheinander abgearbeitet, sodass das einzelne Ausführen nicht nötig ist.

Alle Angaben ohne Gewähr :wink:

In einem unserer Shops gibt es bestimmte Funktionen, die nur angemeldete Kunden verwenden können - ein grosser Anteil davon hat aber noch nie bestellt …

Wann muss man personenbezogene Daten löschen?
Unternehmen müssen personenbezogene Daten etwa dann löschen, wenn sie
für die Zwecke, für die erhoben oder auf sonstige Weise verarbeitet
wurden, nicht mehr notwendig sind. Der Zweck einer Datenverarbeitung
entscheidet also auf über die zulässige Dauer der Speicherung der
verarbeiteten Daten. Dieser so genannte Zweckbindungsgrundsatz ist eines
der wesentlichen Prinzipien des europäischen Datenschutzes. Unternehmen
dürfen personenbezogene Daten nur für vorher festgelegte, eindeutige
und legitime Zwecke erheben. Zudem dürfen Sie diese Daten nicht in einer
mit den ursprünglichen Zwecken nicht zu vereinbarenden Weise
weiterverarbeiten (Art. 5 Abs. 1 lit. b DSGVO). Spätestens, wenn
personenbezogene Daten für die Zwecke nicht mehr erforderlich sind, für
die sie verarbeitet werden, muss das Unternehmen diese Daten löschen.

um den sogenannten Zweckbindungsgrundsatz der DSGVO zu erfüllen muss aber sehr viel mehr gemacht werden:

  1. Kunde hat seine Daten zwar eingegeben (ohne Konto), aber nicht bestellt - Kaufabbruch:
    -> löschen nach z.B. 4 Wochen
    -> delete from oxuser where oxid not in (select oxuserid from oxorder) and oxuser.oxtimestamp < ‘2018-05-19’ (ohne gewähr)
    (noch besser wäre wenn im shop die Kundendaten erst bei einer Bestellung angelegt würden)
  2. Kunde hat ein Konto angelegt aber nicht bestellt:
    -> hierzu vermisse ich im oxid-shop in oxuser ein feld ‘lastlogin’!
    -> dann könnten diese Daten zB nach 1 Jahr nach lastlogin gelöscht werden.
  3. Kunde hat ohne Konto bestellt:
    -> Kundendaten z.B. nach 1 Jahr löschen denn die Adressen stehen ja auch in oxorder
  4. Kunde hat ohne Konto bestellt aber storniert bzw. zurückgeschickt
    -> löschen nach z.B. 4 Wochen

Also wenn ich nun konkret Benutzer löschen will, die sich vor dem 18.06.2018 registriert haben und NICHT bestellt haben oder Benutzer, die sich vor dem 18.06.2018 NICHT registriert haben und NICHT bestellt haben (also als Gastbesteller mit Kaufabbruch)…

Code so exakt richtig?
Dann alle Daten wie oben beschrieben gelöscht und alle anderen Daten noch vorhanden?

1.DELETE FROM oxuser WHERE oxid IN ( SELECT oxuserid FROM oxorder WHERE oxorderdate <= ‘2018-06-17 23:59:59′)

2.DELETE FROM oxaddress WHERE oxuserid NOT IN ( SELECT oxid FROM oxuser)

3.DELETE FROM oxuserbasket WHERE oxuserid NOT IN ( SELECT oxid FROM oxuser)

4.DELETE FROM oxuserbasketitems WHERE oxbasketid NOT IN ( SELECT oxid FROM oxuserbasket)

Das mag ja alles richtig sein, ist aber nicht die Ausgangsfrage. Wenn die Kunden noch nie bestellt haben, steht auch nichts in der oxorder.

Damit löschst Du alle User, dessen Bestellung jünger als das genannte Datum ist.

@oxid-flo mach doch bitte ein komplettes Backup von der DB, bevor du dich ans Löschen machst!
Am besten machst du eine Kopie von der DB und tobst dich auf der Kopie zunächst aus, wenn du dir unsicher bist.

OK - also wird dann in der Datenbank kein Benutzer angelegt wenn der Kunde als “Gast” alle seine Daten eingibt, Artikel auswählt und dann doch wieder den Warenkorb löscht? Ich meine aber schon…Diesen Benutzer würde ich gerne dann löschen, der NIE etwas bestellt hat (mit Gastzugang).

Auch den Benutzer, der sich registriert hat (Kundenkonto angelegt) und NIE bestellt hat würde ich gerne löschen mit allen Daten die mit dem Benutzer im Bezug stehen.

Alle zwei Fälle sollen gelöscht werden mit dem Datum VOR 19.06.2018.
Ist hat ein “Datenmüll” und entspricht ja nicht der DSGVO.

@patchwork.de
Deine weiteren 3 Punkte sind zwar auch erforderlich und sicherlich zwingend erforderlich in einem Update…aber…die oberen zwei Fälle wären mir aktuell wichtiger. Ich frage mich ohnehin, welche Updates bzgl. DSGVO noch von Oxid vorgesehen sind / werden. Abwicklung über ein Modul weiterhin?

Das wäre dann wieder etwas in der Form:
DELETE FROM oxuser WHERE oxpassword = “” AND oxid NOT IN ( SELECT oxuserid FROM oxuserbasket)

Falls es diese Konstellation überhaupt gibt. Eigentlich wird nur der Warenkorb von eingeloggten Usern in der Datenbank gespeichert. Sonst nur in der Session.