|
|
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
|