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
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
[da 1 a 2 di 2 commenti] | Indietro