2012-03-26 9 views
33

sto cercando di modificare la colonna tipo di dati di una chiave primaria per tinyint dalla colonna int.This è una chiave esterna in altri tables.So, ottengo il seguente errore:ALTER TABLE sulla colonna dipendente


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.


c'è un altro modo diverso per eliminare le dipendenze e li ricrea?

risposta

60

credo che si dovrà eliminare i vincoli di chiave esterna prima. Quindi aggiornare tutte le tabelle appropriate e rimapparle come erano.

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 

Tuttavia, a meno che la memoria non sia davvero un grosso problema, manterrei l'identità come INT. A meno che tu non sia al 100% positivo che le tue chiavi non supereranno mai le restrizioni TINYINT. Solo una parola di cautela :)

+1

In SSMS troverete a portata di mano di fare clic destro su indice e scegli "Crea script per l'indice> Genera codice per istruzione INSERT in> ..." –

+0

You rock! Io non avrei sleeped stasera senza di te – dijam

30

Se il vincolo è su un tipo di utente, quindi non dimenticate di vedere se c'è un Default Constraint, di solito qualcosa come DF__TableName__ColumnName__6BAEFA67, in caso affermativo allora si avrà bisogno di abbandonare il Default Constraint, come questo:

ALTER TABLE TableName DROP CONSTRAINT [DF__TableName__ColumnName__6BAEFA67] 

Per ulteriori informazioni vedere i commenti da parte del geniale Aaron Bertrand su this answer.

+1

Giusto per chiarire - il comando DROP CONSTRAINT deve essere eseguita come una query sulla tabella in Visual Studio sul contesto dati lì (non in MS SQL sul database SQL effettivo). (Ho dovuto trovare questo il modo più difficile, essendo un noob a questa roba, così ho pensato altre persone potrebbero trovare questo utile chiarimento). – Andarta

Problemi correlati