[Java/SQL] cascade delete.

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Zoals de topic als zegt wil ik graag weten hoe een cascade delete uitgevoerd kan worden. (heb al heel wat sites bekeken maar heb nog geen antwoord gevonden). Het enigste wat naar voren kwam is dat bij de relatie eigenschappen de delete on cascade ingesteld moet worden. Maar dit is niet altijd mogelijk in een database (als je geen admin bent). Aan de andere kant, denk ook niet dat een admin het fijn zou vinden als ik de provincie Groningen uit de provincie tabel zou gooien :)

Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Cascading deletes zijn evil!

Uhm wanneer je db geen cascading deletes ondersteunt is een trigger vaak een goede manier om de boel schoon te houden.

Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Daarnaast zeg je uit een table gooien, zelfs data die je niet meer gebruikt kan informatie bevatten, zelf prefereer ik daarom altijd een delete flag, kan je altijd later alsnog simpel de boel opschonen.

Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Ik moet helaas echt de info verwijderen, dus een delete flag is voor mij niet interessant. En ik heb ook niet altijd controle over het instellen van triggers (wat eventueel wel met SQL/DDL zou kunnen (volgens mij))

Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Je zou zoiets kunnen doen :

Delete alles in table x where id not in (select id from table y where voorwaarde = wegermee)
Of iets in die zin

Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Je krijgt dan geloof ik een foutmelding dat er nog records zijn die naar het te deleten record verwijzen. Bijvoorbeeld in de tabel persoon: GroningenBewoner naar tabel provincie: Groningen. Omdat GroningenBewoner nog bestaat kan Groningen niet verwijderd worden.

Acties:
  • 0 Henk 'm!

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 21-09 16:54

Goodielover

Only The Best is Good Enough.

Wat is de RDBMS waar je mee werkt?
Afhankelijk van dat ding zijn er opties!

Je moet om dit soort fouten te voorkomen altijd onderaan de boom beginnen, dus eerste alle bewoners weggooien en dan de stad.

De oplossing die hierboven door raptorix werd gegeven, gaat ervan uit dat je DB als niet meer consistent is. Die situatie mag nooit ontstaan.

Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Op donderdag 17 januari 2002 11:22 schreef Alarmnummer het volgende:
Je krijgt dan geloof ik een foutmelding dat er nog records zijn die naar het te deleten record verwijzen. Bijvoorbeeld in de tabel persoon: GroningenBewoner naar tabel provincie: Groningen. Omdat GroningenBewoner nog bestaat kan Groningen niet verwijderd worden.
Je moet ook eerst de records deleten in de "laatste table"

Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Op donderdag 17 januari 2002 11:26 schreef raptorix het volgende:

[..]

Je moet ook eerst de records deleten in de "laatste table"
Maar dat kan een vrij lastige klus worden als persoon ook weer dieren heeft etc etc..
Wat is de RDBMS waar je mee werkt?
Afhankelijk van dat ding zijn er opties!
Het moet database onafhankelijk geimplementeerd worden. Dus ik kan niet uitgaan van database specifieke instellingen/oplossingen.

Acties:
  • 0 Henk 'm!

  • Crazy D
  • Registratie: Augustus 2000
  • Nu online

Crazy D

I think we should take a look.

Op donderdag 17 januari 2002 11:33 schreef Alarmnummer het volgende:
Maar dat kan een vrij lastige klus worden als persoon ook weer dieren heeft etc etc..
Dan lijkt het me dat je dus eerst de dieren moet delen (indien nodig natuurlijk), dan de persoon, etc. Einde van de boom dus zoals gemeld.
En niemand zei toch dat het een eitje zou zijn? :+

Exact expert nodig?


Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Op donderdag 17 januari 2002 11:37 schreef CrazyD_at_work het volgende:

[..]

Dan lijkt het me dat je dus eerst de dieren moet delen (indien nodig natuurlijk), dan de persoon, etc. Einde van de boom dus zoals gemeld.
En niemand zei toch dat het een eitje zou zijn? :+
Als je uitgaat van een vast database model dan is het geen probleem :) Maar dat is bij ons niet zo, we moeten echt een generieke oplossing hebben.

Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
In een goed datamodel komen in principe geen cascading deletes voor, die worden immers geimplementeerd via triggers.

Acties:
  • 0 Henk 'm!

  • Crazy D
  • Registratie: Augustus 2000
  • Nu online

Crazy D

I think we should take a look.

Op donderdag 17 januari 2002 11:40 schreef Alarmnummer het volgende:
Als je uitgaat van een vast database model dan is het geen probleem :) Maar dat is bij ons niet zo, we moeten echt een generieke oplossing hebben.
Ah ja, naatje ;)

Mag je wel uitgaan van een database waarin relaties vastgelegt kunnen worden? (dus dat je geen MySql hoeft te kunnen ondersteunen ;))
Anders lijkt het me knap lastig om te ontdekken tussen welke tabellen er relaties liggen (of krijg je een datadictionairy in je handen programma gedrukt?).

Exact expert nodig?


Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Op donderdag 17 januari 2002 11:42 schreef CrazyD_at_work het volgende:

[..]

Ah ja, naatje ;)

Mag je wel uitgaan van een database waarin relaties vastgelegt kunnen worden? (dus dat je geen MySql hoeft te kunnen ondersteunen ;))
Anders lijkt het me knap lastig om te ontdekken tussen welke tabellen er relaties liggen (of krijg je een datadictionairy in je handen programma gedrukt?).
Als je bv access gebruikt dan kun je helaas geen metadata ophalen over relaties en keys. Ik zie dus uit de replies dat er dus geen sql commando voor is.

Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Als je het echt op een generieke manier wilt doen kan je nog beste een soort van batch script maken die simpelweg checkt of een bepaald record nog wel een bovenliggend record heeft, maar zoals gezegt, maar in principe heb je NOOIT cascading deletes nodig, je moet gewoon gelijk de bende opruimen als je een parent weghaalt, dit kan je doen vanuit je applicatie maar mooier is het nog via een trigger op desbetreffende table te doen.

Acties:
  • 0 Henk 'm!

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 21-09 16:54

Goodielover

Only The Best is Good Enough.

Je zou het ook nog op een OO-achtige manier kunnen oplossen.

Voor elke onderliggende tabel maak je een functie:
delete_if_[parent]_is_deleted (parent_id)

je houdt dan in een eigen mini datadictionary de onderlinge relatietypes bij (dus tabel1 is parent van rabel2)
Maak een generieke functie die kijkt welke kinderen er zijn en de bijbehorende delete_if_[parent]_is_deleted (parent_id)
wordt aangeroepen.
In deze functie zit een loepje die elk van de kinderen verwijderd, maar voor dat 'ie dat doet, kijkt 'ie eerst of hij zlef geen kinderen heeft, dan roept ook die weer eerst delete_if_[parent]_is_deleted (parent_id) aan voor zijn kinderen.
Snappie?
Pagina: 1