Mitglieder können nicht gelöscht werden

Hier melden JVerein-Benutzer ihre Fehler

Moderator: heiner

Antworten
literaturbuero
Beiträge: 5
Registriert: Sonntag 4. September 2016, 12:25
Verein: Literaturbüro in der Euregio Maas-Rhein e.V.
Mitglieder: 70
JVerein-Version: 2.8.13
Betriebssystem: OS X El Capitan

Mitglieder können nicht gelöscht werden

Beitrag von literaturbuero »

Hi,

ich benutze JVerein nun seit einigen Jahren, aber es ist mir noch nicht ein einziges Mal gelungen, Mitglieder zu löschen, die ausgetreten oder verstorben sind. Mit den Jahren kamen so 16(!) Mitglieder zusammen.

Heute habe ich wieder versucht ein Mitglied zu löschen. Beim ersten Versuch kam diese Ausnahme:
Fehler beim Löschen des Mitgliedes
java.rmi.RemoteException: delete failed, rollback successful; nested exception is:
org.h2.jdbc.JdbcSQLException: Referentielle Integrität verletzt: "FKMITGLIEDDOKUMENT1: PUBLIC.MITGLIEDDOKUMENT FOREIGN KEY(REFERENZ) REFERENCES PUBLIC.MITGLIED(ID) (68)"
Referential integrity constraint violation: "FKMITGLIEDDOKUMENT1: PUBLIC.MITGLIEDDOKUMENT FOREIGN KEY(REFERENZ) REFERENCES PUBLIC.MITGLIED(ID) (68)"; SQL statement:
delete from MITGLIED where ID = 68 [23503-193]
at de.willuhn.datasource.db.AbstractDBObject.delete(AbstractDBObject.java:392)
at de.jost_net.JVerein.gui.action.MitgliedDeleteAction.handleAction(MitgliedDeleteAction.java:63)
at de.willuhn.jameica.gui.parts.Button$1$1.run(Button.java:174)
at org.eclipse.swt.custom.BusyIndicator.showWhile(Unknown Source)
at de.willuhn.jameica.gui.GUI$6.run(GUI.java:899)
at org.eclipse.swt.widgets.Synchronizer.syncExec(Unknown Source)
at org.eclipse.swt.widgets.Display.syncExec(Unknown Source)
at de.willuhn.jameica.gui.GUI.startSync(GUI.java:895)
at de.willuhn.jameica.gui.parts.Button$1.widgetSelected(Button.java:168)
at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Display.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.notifyListeners(Unknown Source)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
at de.willuhn.jameica.gui.GUI.loop(GUI.java:916)
at de.willuhn.jameica.gui.GUI.init(GUI.java:327)
at de.willuhn.jameica.system.Application.init(Application.java:145)
at de.willuhn.jameica.system.Application.newInstance(Application.java:87)
at de.willuhn.jameica.Main.main(Main.java:75)
Caused by: org.h2.jdbc.JdbcSQLException: Referentielle Integrität verletzt: "FKMITGLIEDDOKUMENT1: PUBLIC.MITGLIEDDOKUMENT FOREIGN KEY(REFERENZ) REFERENCES PUBLIC.MITGLIED(ID) (68)"
Referential integrity constraint violation: "FKMITGLIEDDOKUMENT1: PUBLIC.MITGLIEDDOKUMENT FOREIGN KEY(REFERENZ) REFERENCES PUBLIC.MITGLIED(ID) (68)"; SQL statement:
delete from MITGLIED where ID = 68 [23503-193]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
at org.h2.message.DbException.get(DbException.java:179)
at org.h2.message.DbException.get(DbException.java:155)
at org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:426)
at org.h2.constraint.ConstraintReferential.checkRowRefTable(ConstraintReferential.java:443)
at org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:318)
at org.h2.table.Table.fireConstraints(Table.java:967)
at org.h2.table.Table.fireAfterRow(Table.java:985)
at org.h2.command.dml.Delete.update(Delete.java:101)
at org.h2.command.CommandContainer.update(CommandContainer.java:98)
at org.h2.command.Command.executeUpdate(Command.java:258)
at org.h2.jdbc.JdbcStatement.executeUpdateInternal(JdbcStatement.java:130)
at org.h2.jdbc.JdbcStatement.executeUpdate(JdbcStatement.java:115)
at de.willuhn.datasource.db.AbstractDBObject.delete(AbstractDBObject.java:374)
... 22 more
Ich habe dann ein Dokument, das dem Mitglied zugeordnet war gelöscht. Dann habe ich wieder versucht das Mitglied zu löschen und diese Ausnahme bekmmen:
Fehler beim Löschen des Mitgliedes
java.rmi.RemoteException: delete failed, rollback successful; nested exception is:
org.h2.jdbc.JdbcSQLException: Referentielle Integrität verletzt: "FKLASTSCHRIFT2: PUBLIC.LASTSCHRIFT FOREIGN KEY(MITGLIED) REFERENCES PUBLIC.MITGLIED(ID) (68)"
Referential integrity constraint violation: "FKLASTSCHRIFT2: PUBLIC.LASTSCHRIFT FOREIGN KEY(MITGLIED) REFERENCES PUBLIC.MITGLIED(ID) (68)"; SQL statement:
delete from MITGLIED where ID = 68 [23503-193]
at de.willuhn.datasource.db.AbstractDBObject.delete(AbstractDBObject.java:392)
at de.jost_net.JVerein.gui.action.MitgliedDeleteAction.handleAction(MitgliedDeleteAction.java:63)
at de.willuhn.jameica.gui.parts.Button$1$1.run(Button.java:174)
at org.eclipse.swt.custom.BusyIndicator.showWhile(Unknown Source)
at de.willuhn.jameica.gui.GUI$6.run(GUI.java:899)
at org.eclipse.swt.widgets.Synchronizer.syncExec(Unknown Source)
at org.eclipse.swt.widgets.Display.syncExec(Unknown Source)
at de.willuhn.jameica.gui.GUI.startSync(GUI.java:895)
at de.willuhn.jameica.gui.parts.Button$1.widgetSelected(Button.java:168)
at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Display.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.notifyListeners(Unknown Source)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
at de.willuhn.jameica.gui.GUI.loop(GUI.java:916)
at de.willuhn.jameica.gui.GUI.init(GUI.java:327)
at de.willuhn.jameica.system.Application.init(Application.java:145)
at de.willuhn.jameica.system.Application.newInstance(Application.java:87)
at de.willuhn.jameica.Main.main(Main.java:75)
Caused by: org.h2.jdbc.JdbcSQLException: Referentielle Integrität verletzt: "FKLASTSCHRIFT2: PUBLIC.LASTSCHRIFT FOREIGN KEY(MITGLIED) REFERENCES PUBLIC.MITGLIED(ID) (68)"
Referential integrity constraint violation: "FKLASTSCHRIFT2: PUBLIC.LASTSCHRIFT FOREIGN KEY(MITGLIED) REFERENCES PUBLIC.MITGLIED(ID) (68)"; SQL statement:
delete from MITGLIED where ID = 68 [23503-193]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
at org.h2.message.DbException.get(DbException.java:179)
at org.h2.message.DbException.get(DbException.java:155)
at org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:426)
at org.h2.constraint.ConstraintReferential.checkRowRefTable(ConstraintReferential.java:443)
at org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:318)
at org.h2.table.Table.fireConstraints(Table.java:967)
at org.h2.table.Table.fireAfterRow(Table.java:985)
at org.h2.command.dml.Delete.update(Delete.java:101)
at org.h2.command.CommandContainer.update(CommandContainer.java:98)
at org.h2.command.Command.executeUpdate(Command.java:258)
at org.h2.jdbc.JdbcStatement.executeUpdateInternal(JdbcStatement.java:130)
at org.h2.jdbc.JdbcStatement.executeUpdate(JdbcStatement.java:115)
at de.willuhn.datasource.db.AbstractDBObject.delete(AbstractDBObject.java:374)
... 22 more
Danach habe ich in JVerein diese Schritte durchgeführt und nach jedem versucht, das Mitglied zu löschen:
  1. Zuordung von Hibiscusbuchungen zu Sollbuchungen in Mitgliedskonto gelöscht
  2. Alle Sollbuchungen in Mitgliedskonto gelöscht
  3. Zahlung auf Barzahlung umgestellt und die Nachfrage zur Löschung der Kontodaten bestätigt
  4. Eine Mail gelöscht, die noch unter Mails angezeigt wurde
Nach jedem dieser Schritte führte der Versuch das Mitglied zu löschen, zu der zweiten Ausnahme:
Referentielle Integrität verletzt: "FKLASTSCHRIFT2: PUBLIC.LASTSCHRIFT FOREIGN KEY(MITGLIED) REFERENCES PUBLIC.MITGLIED(ID) (68)"
Ich verstehe das so: JVerein veruscht das Mitglied aus der Tabelle MITGLIED zu löschen, aber das Mitglied wird noch in der Tabelle LASTSCHRIFT referenziert, weshalb der Eintrag in der Tabelle MITGLIED nicht gelöscht werden kann. JVerein müsste also erst entweder den das Mitglied referenzierenden Eintrag aus der Tabelle LASTSCHRIFT oder die Zuordnung des Eintrages in LASTSCHRIFT zu dem Eintrag in MITGLIED löschen.

Ich brauche hier dringend eine Lösung. Nach meinem Verständnis der DSGVO hätte ich die ausgetretenen Mitglieder nämlich längst aus der Mitgliederverwaltung löschen müssen. Oder anders ausgedrückt mein Eindruck ist, dass JVerein nicht DSGVO-konform ist.

Ich benutze JVerein
  • Version 2.8.18
  • Build-Date 20190623
  • Build-Nr. 521
  • Datenbank-Version 417
unter macOS Catalina 10.15.7 und Java 1.8.0_131.

Ciao

Sarah
sbuer
Beiträge: 62
Registriert: Mittwoch 20. Januar 2021, 02:11
Mitglieder: 200
JVerein-Version: 2.8.19
Betriebssystem: Win

Re: Mitglieder können nicht gelöscht werden

Beitrag von sbuer »

Hallo,

ja dies ist durchaus ein Problem, was ich selber rekonstruieren konnte. Das Problem hast Du gut erkannt. Es kommt aber noch etwas schlimmer weil die Tabelle Mitglied nicht nur auf die Tabelle Lastschrift einen Foreign-Key (Fremdschlüssel)

Das Problem mit der Löschung könnte was mit der Delete Rule in der Datenbank zu tun haben. Das kann ich momentan nur raten.
tabelle_mitglied.png
tabelle_mitglied.png (45.62 KiB) 2083 mal betrachtet
Workaround:
ein passendes SQL-Script bauen was die Tabellen aus PKTABLE_NAME durchgeht und den Datensatz aus Tabelle Mitglied anhand seiner ID entsprechend löscht

Alternative:
Lässt sich die Delete Rule via Alter Table so anpassen das der Delete aus der jverein GUI möglich ist. (evtl. ist diese Definition per se sogar gewollt)

Das ganze muß man aber erstmal sorgfältig durchtesten und sollte mit einer Kopie der Umgebung getestet werden und nicht mit der produktiven Variante.

Gruß,
Stefan
Inoffizielles Release des Openjverein Forks
Repository: https://sbuerg.github.io/jverein_develop
sbuer
Beiträge: 62
Registriert: Mittwoch 20. Januar 2021, 02:11
Mitglieder: 200
JVerein-Version: 2.8.19
Betriebssystem: Win

Re: Mitglieder können nicht gelöscht werden

Beitrag von sbuer »

Hallo,

ich habe nun die Löschung bei mir lösen können.
Es hat tatsächlich mit der Delete Rule des Contraints auf der Tabelle zu tun. Der Restrict Eintrag verhindert das.

In der Datenbank mussten habe ich die Contraints wie folgt anpassen müssen:
Zunächst diesen hier (den Du ja in der Fehlermeldung hattest so wie ich)

ALTER TABLE PUBLIC.LASTSCHRIFT DROP CONSTRAINT PUBLIC.FKLASTSCHRIFT2;
ALTER TABLE PUBLIC.LASTSCHRIFT ADD CONSTRAINT PUBLIC.FKLASTSCHRIFT2 FOREIGN KEY(MITGLIED) REFERENCES PUBLIC.MITGLIED(ID) ON DELETE CASCADE NOCHECK;

Nach der Änderung habe ich diese Fehlermeldung erhalten

Caused by: org.h2.jdbc.JdbcSQLException: Referentielle Integrität verletzt: "FKBUCHUNG3: PUBLIC.BUCHUNG FOREIGN KEY(MITGLIEDSKONTO) REFERENCES PUBLIC.MITGLIEDSKONTO(ID) (38)"
Referential integrity constraint violation: "FKBUCHUNG3: PUBLIC.BUCHUNG FOREIGN KEY(MITGLIEDSKONTO) REFERENCES PUBLIC.MITGLIEDSKONTO(ID) (38)"; SQL statement:
delete from MITGLIED where ID = 179 [23503-196]

Um diesen zu lösen, muß dieser hier angepasst werden

ALTER TABLE PUBLIC.BUCHUNG DROP CONSTRAINT PUBLIC.FKBUCHUNG3;
ALTER TABLE PUBLIC.BUCHUNG ADD CONSTRAINT PUBLIC.FKBUCHUNG3 FOREIGN KEY(MITGLIEDSKONTO) REFERENCES PUBLIC.MITGLIEDSKONTO(ID) ON DELETE CASCADE NOCHECK;

Bei mir lies sich nach dieser Änderung das Löschen problemlos durchführen. Je nachdem welche Funktionen von jverein verwendet werden (Kursteilnehmer,Zusatzbeitrag) kann es vorkommen das noch weitere Contraints anzupassen sind.

Ich habe die Änderung mit SQuirreL SQL-Client durchgeführt. Ebenso kann man das auch via org.h2.tools.RunScript durchführen. Hier wurde das RunScript einmal genutzt: viewtopic.php?p=17622#p17622

Gruß,
Stefan
Inoffizielles Release des Openjverein Forks
Repository: https://sbuerg.github.io/jverein_develop
Antworten