web-dev-qa-db-ja.com

依存列のALTER TABLE

主キーの列データ型をintからtinyintに変更しようとしています。この列は他のテーブルの外部キーです。そのため、次のエラーが表示されます。


メッセージ5074、レベル16、状態1、行1オブジェクト「PK_User_tbl」は列「appId」に依存しています。メッセージ5074、レベル16、状態1、行1オブジェクト「FK_Details_tbl_User_tbl」は列「appId」に依存しています。メッセージ5074、レベル16、状態1、行1オブジェクト「FK_Log_tbl_User_tbl」は列「appId」に依存しています。メッセージ4922、レベル16、状態9、行1 ALTER TABLE ALTER COLUMN appIdは、1つ以上のオブジェクトがこの列にアクセスするために失敗しました。


依存関係を削除して再作成する以外の方法はありますか?

44
Milee

最初に外部キー制約を削除する必要があると思います。次に、すべての適切なテーブルを更新し、それらをそのまま再マップします。

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

ただし、メモリが本当に大きな問題でない限り、私はIDをINTとして保持します。キーがTINYINTの制限を超えて成長することは決してないという100%の確信がない限り。注意の言葉:)

77
Justin Pihony

制約がユーザータイプにある場合は、Default Constraint(通常DF__TableName__ColumnName__6BAEFA67のようなもの)があるかどうかを忘れずに確認してください。そうであれば、Default Constraintをドロップする必要があります。このような:

ALTER TABLE TableName DROP CONSTRAINT [DF__TableName__ColumnName__6BAEFA67]

詳細については、 this answer の素晴らしいアーロンバートランドによるコメントを参照してください。

37
Serj Sagan

あなたを制限している制約をドロップすることができます。列が他のテーブルにアクセスできる場合。ビューが変更している列にアクセスしている場合、ビューをドロップしない限り、列を変更することはできません。変更を加えた後、ビューを再作成できます。

enter image description here

0
Santosh