2012-03-26 77 views
33

Estoy tratando de alterar el tipo de datos de columna de una clave principal a tinyint de la columna int.This es una clave externa de otra tables.So, me sale el siguiente error:ALTER TABLE en la columna dependiente


Msg 5074, Level 16, State 1, Line 1 The object 'PK_User_tbl' is dependent on column 'appId'. Msg 5074, Level 16, State 1, Line 1 The object 'FK_Details_tbl_User_tbl' is dependent on column 'appId'. Msg 5074, Level 16, State 1, Line 1 The object 'FK_Log_tbl_User_tbl' is dependent on column 'appId'. Msg 4922, Level 16, State 9, Line 1 ALTER TABLE ALTER COLUMN appId failed because one or more objects access this column.


¿Hay alguna otra forma que no sea eliminar dependencias y volver a crearlas?

Respuesta

60

Creo que primero tendrá que eliminar las restricciones de clave externa. Luego actualice todas las tablas apropiadas y vuelva a asignarlas como estaban.

ALTER TABLE [dbo.Details_tbl] DROP CONSTRAINT [FK_Details_tbl_User_tbl]; 
-- Perform more appropriate alters 
ALTER TABLE [dbo.Details_tbl] ADD FOREIGN KEY (FK_Details_tbl_User_tbl) 
    REFERENCES User_tbl(appId); 
-- Perform all appropriate alters to bring the key constraints back 

Sin embargo, a menos que la memoria sea realmente un gran problema, mantendría la identidad como INT. A menos que esté 100% seguro de que sus llaves nunca crecerán más allá de las restricciones TINYINT. Sólo una palabra de precaución :)

+1

En SSMS, encontrará a mano derecha para hacer clic en el índice y seleccionar "Crear secuencia de comandos para índice> Generar código para instrucción INSERT en> ..." –

+0

¡Rock! No habría dormido esta noche sin ti – dijam

30

Si su limitación está en un tipo de usuario, entonces no se olvide de ver si hay una Default Constraint, generalmente algo como DF__TableName__ColumnName__6BAEFA67, si es así, tendrá que caer el Default Constraint, como esto:

ALTER TABLE TableName DROP CONSTRAINT [DF__TableName__ColumnName__6BAEFA67] 

Para más información ver los comentarios de la brillante Aaron Bertrand en this answer.

+1

Solo para aclarar: el comando DROP CONSTRAINT debe ejecutarse como una consulta en la tabla en Visual Studio en el contexto de datos allí (no en SQL MS en la base de datos SQL real). (Tenía que descubrirlo de la manera difícil, ser un novato en esto, así que pensé que otras personas podrían encontrar esta aclaración útil). – Andarta

Cuestiones relacionadas