web-dev-qa-db-ja.com

SQL 2008でテーブルを削除せずに列を変更する方法

列タイプをintからrealに変更しようとすると、SQL 2008が突然テーブルをドロップしたいのはなぜですか?私の知る限り、これはSQL 2005では決して起こりませんでした。どんな洞察も役立つでしょう。

42
Middletone

SQL Server 2008では、[ツール] >> [オプション]に移動します。小さなウィンドウで、「デザイナー」をクリックします。 「必要な変更を保存しないようにする...」のチェックを外します

=====

2015年9月4日に編集

私は、かなり前に、この質問で説明した状況を解決する方法を説明するこの答えをここに追加しました。それ以来、以下のスレッドのユーザーは、私が当時お勧めした方法で物事を行うことに関するいくつかの懸念を明らかにしました。基本的に、私が説明したソリューションは、いくつかのシナリオで問題になる可能性があります。次に、他のユーザーのコメントを確認し、最適なソリューションを選択するために読み続けることをお勧めします。

38
Marcos Buarque

一番の答えが長い間ここに座っているとは信じられません-非常に危険なアドバイスです!

テーブルを削除せずにインプレースで実行できる操作はほとんどありません。

テーブルを削除せずに列を変更できない場合は、通常、SELECT INTOクエリを使用してデータを新しいテーブルに投影し、古いテーブルを削除して(一時的に制約を無効にし)、次に、投影されたテーブルの名前を変更します。ただし、この場合、メンテナンスのためにデータベースをオフラインにする必要があります。

45

私が使用するものは次のとおりです。

-- Add new column
ALTER TABLE MyTable
ADD Description2 VARCHAR(MAX)
GO

-- Copy data to new column (probably with modifications)
Update MyTable
SET Description2 = Description
GO

-- Drop old column
ALTER TABLE MyTable
DROP COLUMN Description
GO

-- Rename new column to the original column's name.
sp_RENAME 'MyTable.Description2' , 'Description', 'COLUMN'
GO
  1. データを新しい列にコピーします。
  2. 古い列をドロップします。
  3. 新しい列の名前を古い列の名前に変更します。
36
user2173353

同じ問題があります。別のsaアカウントを使用しようとすると、私のアカウントはsa権限を持ちますが、機能します。どういうわけか私のアカウントには変更する機能がないようです。まだ調査中ですが、許可の問題です。

更新:

私はそれを説明することはできません。しかし、これは私がやったことです。アカウントが属している2つのドメイングループがあります。 1つは新しいADドメイングループで、もう1つはNTレゲエドメイングループでした。レガシードメイングループを削除すると、テーブルを正常に変更できました。両方のグループに「sa」特権があることに注意してください。

振る舞いは、alterコマンドが成功するというものでしたが、テーブルでは何も変わりませんでした。その後、デザイナーを介して手動でフィールドを変更しようとしたときに、テーブルを削除して再作成する必要がある場合、変更を加えることは許可されないと不平を言いました。ツールで設定を見つけ、それをオフにすることができました。しかし、このテーブルは巨大であり、これを行うことはお勧めできません。私はそれに対して他の人に助言する必要があります。

それは許可の問題でした。どのように説明することはできませんが、それが他の誰かに役立つことを願っています

0
Roberto Torrres

テーブルを完全に削除せずにこれを行う別の方法は、

  1. 列値のバックアップを取ります。
  2. まだヌルを許可していない場合は、列をヌル可能にします。実行して列の値をnullに設定します

    update tablename set columnname = null 
    
  3. 列を削除する
  4. 削除された列と希望するタイプと同じ名前の新しい列を挿入します
  5. 保存したデータをこの列に挿入します