Access & C.

[OT] Convertire un INT in IDENTITY su SQL Server 2000

Forse questo argomento è decisamente OFF-TOPIC per questo blog ma, in attesa di aprirne uno specifico su SQL e dintorni, lo pubblico in questa sede visto che sono molti quelli che impiegano Access come front-end verso SQL Server.

Il problema mi è capitato in sede di migrazione di una banca dati, vecchia di ben 16 anni, su SQL Server 2000. Mi sono accorto che il progettista di allora aveva gestito l'incremento degli identificatori dei record di diverse tabelle direttamente dal programma applicativo (nenache con un trigger!).

La prima operazione che ho dovuto fare, una volta migrato il vecchio database sulla piattaforma SQL Server 2000 (di sviluppo), è stata quella della conversione delle colonne INT degli identificatori di record in IDENTITY ma la shell (Query Analyzer) mi restituiva un errore. Ad esempio:

ALTER TABLE DIPARTIMENTO
ALTER COLUMN DIPARTIMENTO INT    IDENTITY(1,1)
GO

restituiva

Server: Msg 156, Level 15, State 1, Line 2
Incorrect syntax near the keyword 'IDENTITY'.

Ho fatto diverse vane ricerche su Internet ed alla fine ho dovuto concludere che non si può convertire da script SQL una colonna integer in identity.

Ho scritto, però, un laborioso workaround che consiste nel

  1. creare una tabella temporanea, di struttura identica alla tabella origine, in cui però la colonna dei valori interi identificatori di record è definita come IDENTITY;
  2. rimuovere tutti gli eventuali vincoli di integrità referenziale verso la tabella origine perchè andrà successivamente eliminata;
  3. impostare il flag che consente l'inserimento forzato di valori in colonne identity a ON;
  4. copiare i dati della tabella di origine nella tabella temporanea;
  5. impostare il flag che consente l'inserimento forzato di valori in colonne identity a OFF;
  6. eliminare la tabella di origine;
  7. rinominare la tabella temporanea come la tabella origine;
  8. ripristinare tutti i vincoli precedentemente rimossi;

Il workaround è di validità generale.

Siccome un esempio vale più di mille discorsi, ecco come, da script, ho cambiato una colonna da INT a INT IDENTITY

-- CANCELLO I VINCOLI DALLA TABELLA ORIGINE
   ALTER TABLE SERVIZI_UFFICI
   DROP CONSTRAINT FK__SERVIZI_U__SERVI__1BC821DD
   GO
ALTER TABLE SERVIZI
   DROP CONSTRAINT PK_SERVIZI
   GO
-- CREO UNA SECONDA TABELLA, CLONE DELLA PRECEDENTE
   CREATE TABLE TMP_SERVIZI(
   SERVIZI INT IDENTITY(1,1),
   UFFICI INT,
   Descr VARCHAR(100),
   OSCURATO INT DEFAULT 0,
   Data_Sys DATETIME DEFAULT GETDATE(),
   Data_UM DATETIME,
   Operatore INTEGER
   )
-- IMPOSTO LA PROPRIETA' IDENTITY_INSERT PER FORZARE    L'INSERIMENTO DI VALORI ESPLICITI
   -- NOTA: IL COMANDO PUO' ESSERE ESEGUITO SOLO CON SPECIALI PRIVILEGI
   SET IDENTITY_INSERT TMP_SERVIZI ON    -- ORA POSSO INSERIRE QUELLO CHE MI PARE
   GO
-- INSERIMENTO
   INSERT INTO TMP_SERVIZI(SERVIZI, UFFICI, Descr,    OSCURATO, Data_Sys, Data_UM, Operatore)
   SELECT TMP_SERVIZI, UFFICI, Descr, OSCURATO, Data_Sys,    Data_UM, Operatore
   FROM SERVIZI
   GO
-- ELIMINO LA VECCHIA TABELLA
   DROP TABLE SERVIZI
   GO
-- RINOMINO LA TABELLA TEMPORANEA
   exec sp_rename 'TMP_SERVIZI',    'SERVIZI'
   GO


SET IDENTITY_INSERT SERVIZI OFF -- RIMUOVO LA POSSIBILITA' DELL'INSERIMENTO FORZATO
GO
-- RIPRISTINO DEI VINCOLI
ALTER TABLE SERVIZI
   ADD CONSTRAINT PK_SERVIZI PRIMARY    KEY(SERVIZI)
   GO
ALTER TABLE SERVIZI_UFFICI
   ADD CONSTRAINT REF_UFFICI_SERVIZI FOREIGN    KEY (SERVIZI) REFERENCES SERVIZI(SERVIZI)
   GO
 
Inserisci un commento   |   Indietro

[1] Nick Name: Simplex2     Data: 20/11/2008 15:26:37   
Il mio sito ed il mio blog sono nati proprio per discutere, tra le altre cose, quelli che tu chiami i lati oscuri di Access.    
[2] Nick Name: Bluesign     Data: 14/11/2008 01:17:40   
Ti chiedo anticipatamente scusa ma... ho poca famigliarità con i blog! in pratica io vorrei solo chiederti aiuto al riguardo di access, sono anche io un ing. (civile) direi più o meno della tua età e.... per me access ha ancora parecchi lati oscuri!!! mi farebbe piacere quindi trovare un valido tutor! mi fai sapere? grazie!   

  [da 1 a 2 di 2 commenti]     |   Indietro

Inserisci un commento

Nick: e-mail:

web:

Commento: