Minulla on iso relaatiotietokanta MS SQL Serverissä. Nyt täytyisi massa-ajossa poistaa yhdestä taulusta rivejä, mikäli sillä ei ole relaatiota muihin tauluihin. Näitä mahdollisia relaatioita voi olla useaan eri tauluun.
Tein tätä poistoa varten stored proceduren. Siinä relaatio- tsekit hoidetaan omalla selectillä jokaiseen tauluun, jossa voi olla relaatio. Homma hoituu hienosti kyllä sillä. Mutta ongelmana onkin massa-ajo, missä tuota sp:tä ajetaan noin tuhansia kertoja peräkkäin. Query Analyzer hidastuu ja lopulta resurssit kyselyn suorittamiseen loppuu tyystin. Kysely käytännössä pysähtyy.
Nyt kysyisinkin, että mikä olisi tehokkain tapa tarkistaa onko tuollaisessa läjästä tauluja relaatiota tähän yhteen tietueeseen mikä halutaan poistaa. Voisko sitä tehdä mitenkää esim yhdellä selectillä?
Oletettavasti olet poistamassa rivejä isätaulusta? Tällöinhän viisasta olisi määritellä tauluun esimerkiksi tässä tapauksessa viite-eheyssäännöksi estosääntö, jolloin poisto isätaulusta ei ole mahdollista mikäli lapsitaulun rivissä on isätaulun riviin viittaus. Lapsitaulusta poistettaessa luonnollisesti poistetaan ne, joissa viiteavaimet ovat NULL.
CREATE TABLE lapsitaulu ( sarake1 CHAR(4) PRIMARY KEY sarake2 SMALLINT, CONSTRAINT lapsitaulu_it_fk FOREIGN KEY (sarake2) REFERENCES isataulu(perusavain) ON DELETE NO ACTION)
Jotakuinkin noinhan se menee. Jälkikäteen viite-eheyssäännön lisäyksessä pitänee ensin poistaa vanha määritys ja sen jälkeen ADD CONSTRAINT, en tosin mene vannomaan sillä moista ei ole tarvinnut itselläni koskaan tehdä.
Toivottavasti ymmärsin kysymyksen oikein :)
Kiitos muistuksesta, Olga! Ymmärsit ongelman täysin oikein. Nyt pääsee taas toivottavasti eteenpäin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.