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
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.
Uhm wanneer je db geen cascading deletes ondersteunt is een trigger vaak een goede manier om de boel schoon te houden.
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))
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
Delete alles in table x where id not in (select id from table y where voorwaarde = wegermee)
Of iets in die zin
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.
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.
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.
Je moet ook eerst de records deleten in de "laatste table"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.
Maar dat kan een vrij lastige klus worden als persoon ook weer dieren heeft etc etc..Op donderdag 17 januari 2002 11:26 schreef raptorix het volgende:
[..]
Je moet ook eerst de records deleten in de "laatste table"
Het moet database onafhankelijk geimplementeerd worden. Dus ik kan niet uitgaan van database specifieke instellingen/oplossingen.Wat is de RDBMS waar je mee werkt?
Afhankelijk van dat ding zijn er opties!
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.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..
En niemand zei toch dat het een eitje zou zijn?
Exact expert nodig?
Als je uitgaat van een vast database model dan is het geen probleemOp 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?
In een goed datamodel komen in principe geen cascading deletes voor, die worden immers geimplementeerd via triggers.
Ah ja, naatjeOp donderdag 17 januari 2002 11:40 schreef Alarmnummer het volgende:
Als je uitgaat van een vast database model dan is het geen probleemMaar dat is bij ons niet zo, we moeten echt een generieke oplossing hebben.
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?
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.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 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.
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?
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