Newsgroup: it.comp.software.database
Titolo: [SqlServer] update su una colonna identity

Ciao ragazzi,
 
 
 
una roba che forse a qualcuno servirà (ho perso oggi un po' di tempo
per arrivare a questa soluzione - che non è bella ma funziona):
 
2 tabelle, in master-detail tra di loro:
 
create table originale
(
    id int identity not null primary key,
    nome varchar(20) not null 
);
 
create table dettaglio
(
    idoriginale int not null,
    nome varchar(50) not null 
);
 
alter table dettaglio add
    constraint fk_originale_dettaglio foreign key
    (
        idoriginale
    )
    references originale
    (
        id
    );
 
popolate con questi dati:
 
set 
    identity_insert originale on;
insert into originale
(
    id, 
    nome
) 
values
(
    1, 
    'pula originale'
);
insert into originale
(
    id, 
    nome
) 
values
(
    2, 
    'cazzo originale'
);
insert into originale
(
    id, 
    nome
) 
values
(
    3, 
    'niente originale'
);
set 
    identity_insert originale off;
 
insert into dettaglio
(
    idoriginale, 
    nome
) 
values
(
    1, 
    'pula dettaglio'
);
insert into dettaglio
(
    idoriginale, 
    nome
) 
values
(
    2, 
    'cazzo dettaglio'
);
Il problema è di fare un update di questo tipo:
 
update
    originale
set
    id = 4
where
    id = 3;
 
su una colonna identity. L'unica soluzione (secondo me) è questa:
creare 2 altre tabelle, una senza identity e l'altra con
 
create table originale_copia1
(
    id int not null primary key,
    nome varchar(20) not null 
);
 
create table originale_copia2
(
    id int identity not null primary key,
    nome varchar(20) not null 
);
 
copiare i dati da quella originale nella prima:
 
insert 
    originale_copia1 
select 
    * 
from 
    originale;
 
fare lì l'update:
 
update
    originale_copia1
set
    id = 4
where
    id = 3;
 
copiare poi i dati da questa prima tabella nella seconda:
 
set 
    identity_insert originale_copia2 on;
insert 
    originale_copia2
    (
        id, 
        nome
    ) 
select 
    id, 
    nome 
from 
    originale_copia1;
set 
    identity_insert originale_copia2 off;
 
cancellare la constraint di foreign key che fa riferimento a quella
originale:
 
alter table dettaglio drop
    constraint fk_originale_dettaglio;
 
rifarla con un riferimento alla seconda copia:
 
alter table dettaglio add
    constraint fk_originale_dettaglio foreign key
    (
        idoriginale
    )
    references originale_copia2
    (
        id
    );
 
cancellare la tabella originale:
 
drop table originale;
 
e poi, da SQL Server Enterprise Manager (qui non sono riuscito a
rinominare via T-SQL la tabella - e fare un update su sysobjects non
conviene) fare "Rinomina" (click destra sulla tabella) da
"originale_copia2" a "originale"
 
Peccato che non esiste qualcosa di questo genere: 
 
alter table originale alter column id drop identity;
update originale set id = 4 where id = 3;
alter table originale alter column id add identity;
 
Ciao,
 
 
 
Adrian
 
P.S.: Scusate le parolacce nei dati di esempio :-)


Ciao Adrian,
forse non ho capito il problema, ma non è più semplice fare così ?
-------------------------
SET IDENTITY_INSERT Originale ON
INSERT Originale (Id,Nome)
SELECT 5,Nome
FROM Originale
WHERE Id=2
SET IDENTITY_INSERT Originale OFF
UPDATE Dettaglio
       SET idoriginale=5
WHERE idoriginale=2
DELETE ORIGINALE
WHERE Id=2
-------------------------
Ciao Giorgio

 >
[CUT]
Dimenticavo...
Per rinominare una tabella puoi usare la Stored procedure sp_rename
'vecchionome','nuovonome'.
Trovi tutto nel Book On Line
http://www.microsoft.com/sql/techinfo/productdoc/2000/books.asp
Ciao Giorgio

 non č piů semplice fare cosě ?
Hai ragione, grazie,
Adrian