ALTER TABLE

giovedì 16 febbraio 2006 - 10.12

ysdemarc Profilo | Expert

Ho una tabella (MS SQL SERVER) dove ad una colonna SMALLINT devo fargli supportare i valori INT

Quindi provo ad eseguire questa istruzione per cambiare il tipo di dati:

ALTER TABLE MyTable ALTER COLUMN MyColumn INT

ma ottengo questo messaggio di errore:

(messaggio da sql query analizar)

Server: messaggio 5074, livello 16, stato 1, riga 1
Il oggetto 'DF__MyTable__ProvR__733B0D96' dipende da colonna 'MyColumn'.
Server: messaggio 4922, livello 16, stato 1, riga 1
ALTER TABLE ALTER COLUMN MyColumn non è riuscita perché uno o più oggetti accedono a questa colonna.

Che significa? dove sono questi oggetti e come eliminarli?

lbenaglia Profilo | Guru

> Server: messaggio 5074, livello 16, stato 1, riga 1
> Il oggetto 'DF__MyTable__ProvR__733B0D96' dipende da colonna 'MyColumn'.
> Server: messaggio 4922, livello 16, stato 1, riga 1
> ALTER TABLE ALTER COLUMN MyColumn non è riuscita perché uno o più oggetti accedono a questa colonna.

Ciao ysdemarc,

l'errore è dovuto al fatto che sulla colonna ProVR della tabella MyTable è stato definito un constraint DEFAULT che assegna automaticamente un valore se in fase di INSERT non viene specificata la colonna oppure viene passato il valore DEFAULT.
Prima di poter modificare la definizione della colonna, occorre rimuovere tutti gli eventuali constraint definiti su di essa.
Inoltre sarebbe opportuno assegnare un nome significativo ad un constraint, diversamente SQL Server assegnerà automaticamente un nome autogenerato.
Guarda il seguente esempio:

USE tempdb; GO /* Definisco la tabella dbo.Students */ CREATE TABLE dbo.Students( StudentID int NOT NULL IDENTITY CONSTRAINT PK_StudentID PRIMARY KEY, FirstName varchar(10) NOT NULL, LastName varchar(10) NOT NULL, Age smallint NOT NULL DEFAULT 20 ); GO /* Tento di modificare il data type della colonna Age */ ALTER TABLE dbo.Students ALTER COLUMN Age int NOT NULL; GO /* Output: Msg 5074, Level 16, State 1, Line 1 The object 'DF__Students__Age__0AD2A005' is dependent on column 'Age'. Msg 4922, Level 16, State 9, Line 1 ALTER TABLE ALTER COLUMN Age failed because one or more objects access this column. */ /* Elimino il constraint DEFAULT */ ALTER TABLE dbo.Students DROP CONSTRAINT DF__Students__Age__0AD2A005; GO /* Modifico il data type della colonna Age*/ ALTER TABLE dbo.Students ALTER COLUMN Age int NOT NULL; GO /* Definisco un nuovo default */ ALTER TABLE dbo.Students ADD CONSTRAINT DF_Age DEFAULT 25 FOR Age; GO /* Pulizia */ DROP TABLE dbo.Students;

Ciao!

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

ysdemarc Profilo | Expert

grazie mille Lorenzo.. provo subito

Ciao!

Vincenzo
Programmatore sbilenco :-D

ysdemarc Profilo | Expert

Scusami ancora...
ma c'è un modo per sapere il nme del costraint assegnato in automatico da sqlserver?

Hai perfettamente ragione che va assegnato un nome più identificativo e non lasciare mai i nomi di default. Purtroppo è una situazione che mi sono trovatodavanti e che mi devo smazzare.
(sapessi che rottura)
Tra l'altro di sql coosco non molto..

Grazie. Ciao!

Vincenzo
Programmatore sbilenco :-D

lbenaglia Profilo | Guru

>Scusami ancora...
>ma c'è un modo per sapere il nme del costraint assegnato in automatico
>da sqlserver?

Certo, puoi ricorrere alla stored procedure di sistema sp_helpconstraint:

EXEC sp_helpconstraint [dbo.students]

Per maggiori informazioni consulta i Books Online:
http://msdn.microsoft.com/library/en-us/tsqlref/ts_sp_help_96d0.asp

>Grazie. Ciao!
Prego.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
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