Alter Column

venerdì 03 ottobre 2008 - 11.55

4mane Profilo | Junior Member

Salve a tutti.
Vi indico subito il problema che ho in SQL 2005.
Ho una tabella TAB_CL (di grandi dimensioni) per la quale devo specificare che il campo ID_TAB_CL, attuale chiave primaria di tipo int, deve essere autoincrementante, ovvero con la proprietà Identity impostata su True.
Da SQL Managment ho provato a fare l'operazione da progettazione tabella, ma va in timeout.

Ho provato a scrivere questo script, ma mi dà errore:

USE DBCL2008 ALTER TABLE TAB_CL WITH NOCHECK ALTER COLUMN ID_TAB_CL INT IDENTITY(1,1)

Potete indicarmi il corretto script per l'aggiornamento della proprietà Identity?
Grazie a tutti.

ale.orma Profilo | Junior Member

Devi prima eliminare la colonna e poi ricrearla specificando l'identity

4mane Profilo | Junior Member

Sono d'accordo con te, ma quello che mi chiedo: visto che da progettazione tabella è possibile fare tale operazione, non è che esiste qualche stored procedure di sistema che faccia tale operazione?
Anche perché, essendo che la chiave primaria attuale è presente in altre tabelle, eliminandola e ricreandola perderei tutti i relativi collegamenti...

lbenaglia Profilo | Guru

>Sono d'accordo con te, ma quello che mi chiedo: visto che da
>progettazione tabella è possibile fare tale operazione, non è
>che esiste qualche stored procedure di sistema che faccia tale
>operazione?

Se lanci una sessione di Profiler, noterai che SSMS dietro le quinte non fa altro che creare una nuova tabella col suffisso temp e colonna IDENTITY, la popola, droppa la vecchia e rinomina la temp.
Una vera porcata

>Anche perché, essendo che la chiave primaria attuale è presente
>in altre tabelle, eliminandola e ricreandola perderei tutti i
>relativi collegamenti...
Mi spiace, non è possibile definire o rimuovere la proprietà IDENTITY ad una colonna preesistente.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

4mane Profilo | Junior Member


Alla porcata ci ero arrivato anche io...
Non pensavo che fosse stata utilizzata questa procedura da MS!
Ok, grazie a tutti per le risposte!

Simplex2 Profilo | Newbie

Salve a tutti,
ho letto solo ieri questo post. Oggi mi sono registrato al forum, ed ora dico la mia:
Ho provato a fare "il giro di peppe" da Voi egregiamente descritto ma vi sono delle difficoltà se la colonna INT originaria, cioè quella da eliminare e da sostituire con quella "di copia", conteneva già dei valori.
Infatti ho creato al colonna temporanea tmp_X, definendola Identity, ed ho provato a copiarvi il contenuto della colonna originaria X: qui nascono i problemi perchè non è possibile usare l'istruzione UPDATE con gli IDENTITY.

Soluzione drastica: invece di creare una colonna temporanea ho creato una tabella temporanea con cui, poi, ho sostituito la tabella originaria dopo il riversamento dei dati.
I dettagli in questo articolo:
http://www.mdenittis.it/Blog/VisualizzaArticolo.asp?ID=22

Ciao a tutti.
Simplex2
www.mdenittis.it



lbenaglia Profilo | Guru

>Soluzione drastica: invece di creare una colonna temporanea ho
>creato una tabella temporanea con cui, poi, ho sostituito la
>tabella originaria dopo il riversamento dei dati.
>I dettagli in questo articolo:
>http://www.mdenittis.it/Blog/VisualizzaArticolo.asp?ID=22

Io non ho parlato di colonna temporanea, ma di nuova tabella
Tecnicamente è possibile specificare dei valori per una colonna IDENTITY impostando a ON l'opzione SET IDENTITY_INSERT per la tabella in questione, ma non vedo come possa essere utile in questo contesto.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Simplex2 Profilo | Newbie

>Io non ho parlato di colonna temporanea, ma di nuova tabella

Si, effettivamente rileggendo meglio il mio intervento è comprensibile il fraintendimento.
Ma io non facevo riferimento solo al tuo messaggio ma a tutto il thread.

>Tecnicamente è possibile specificare dei valori per una colonna IDENTITY impostando a ON l'opzione SET >IDENTITY_INSERT per la tabella in questione, ma non vedo come possa essere utile in questo contesto.

La mia non è una soluzione tecnicamente possibile ma una realmente implementata. Senza l'opzione SET IDENTITY_INSERT ON non riuscivo ad inserire i dati dalle tabelle originarie in quelle temporanee appositamente create (ovviamente mantenendo i valori originari). Quindi l'opzione è stata utile eccome! Considera anche che io dovevo migrare e ristrutturare un intero DB di 16 anni di attività (quindi con 16 anni di dati). Quello era il mio contesto.
Poi, se esiste una soluzione più breve per ottenere lo stesso risultato, ben venga! Devo dismettere e ristrutturare ancora un intero parco applicativi con la stessa tecnologia osoleta!

Ciao e Grazie.
Simplex2
www.mdenittis.it




Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5