Group: microsoft.public.it.sql




Subject: Dubbio sulla nocheck e check di una alter table
From: AlessandroD
Date: 5/3/2007 3:08:19 PM
Andrew wrote: > Ho una tabella dove ho disabiltato con la alter table x nocheck > constaint all tutti i constraint e foreign key. > Inserisco i dati, quindi riabilito tutti i contraint. > > Mi aspettavo che così facendo sql si fosse fatto un giro per la > tabella e avesse verificato se tutti i vincoli fossero rispettati > anche per i dati presenti. > No, la riabilitazione non prevede retroattività. > Sò che per la delete questo non può avvenire, e mi sta bene, ma perchè > con la riabilitazione il check non avviene? > L'han fatta così... :-) > Cosa altro bisogna fare ? > Niente, se hai bisogno di sapere se i tuoi dati sono buoni dal punto di vista del rispetto dei tuoi constraints, o lasci i constraints abilitati mentre manipoli i dati e quindi intercetti gli errori mentre escono, oppure, nel modo che hai seguito to, sei costretto a fare delle query di controllo che evidenzino le inconsistenze. Io preferirei la prima strada, ti risparmi un bel po' di query inutilty che fra l'altro saresti costretto a dover inseguire nel caso in futuro dovessi modificare i constraints della tabella. Ciao, Alessandro

Subject: Dubbio sulla nocheck e check di una alter table
From: Andrea Benedetti
Date: 5/3/2007 3:12:33 PM
Salve Andrew, "Andrew" <andrea.moro.webma@gmail.com> ha scritto nel messaggio news:1178196607.002342.199450@p77g2000hsh.googlegroups.com... >Ho una tabella dove ho disabiltato con la alter table x nocheck >constaint all tutti i constraint e foreign key. >Inserisco i dati, quindi riabilito tutti i contraint. > >Mi aspettavo che così facendo sql si fosse fatto un giro per la >tabella e avesse verificato se tutti i vincoli fossero rispettati >anche per i dati presenti. > >Sò che per la delete questo non può avvenire, e mi sta bene, ma perchè >con la riabilitazione il check non avviene? Riapplicando la relazione che avviene tramite chiavi esterne SQL Server assume che il padre esista. Di conseguenza applicandola non viene fatto nessun controllo di correttezza dei dati. create table padre ( idRecord int primary key, valore varchar(10) ) go create table figlio ( idRecord int primary key, idPadre int, valore varchar(10) ) go -- aggiungo FK alter table figlio add constraint FK FOREIGN KEY (idPadre) references padre (idRecord) go -- insert dati validi insert padre values (1,'padre') insert figlio values (1, 1, 'figlio') -- stacco FK alter table figlio NOCHECK CONSTRAINT FK insert figlio values (2, 2, 'figlio') -- attacco ancora FK alter table figlio CHECK CONSTRAINT FK select * from padre select * from figlio drop table figlio drop table padre go Diciamo che si "stacca" una chiave esterna per velocizzare importazioni dati o simili e, quindi si spera che i dati in ingresso siano corretti. Se così non fosse i dati orfani verranno scritti ma non letti... >Cosa altro bisogna fare ? Nulla... o qualcosa di custom: dopo aver riapplicato il vincolo fare una left join per vedere se ho figli orfani >Ciao >Andrea Ciao! -- Andrea Benedetti Microsoft MVP - SQL Server www.absistemi.it - www.ugiss.org http://blogs.ugidotnet.org/ab http://mvp.support.microsoft.com http://italy.mvps.org

Subject: Dubbio sulla nocheck e check di una alter table
From: AlessandroD
Date: 5/3/2007 3:45:17 PM
AlessandroD wrote: >> > No, la riabilitazione non prevede retroattività. > Castronata corretta dal post di Luca. Pardon, Alessandro