2016-05-11 5 views
2

decimal列の精度を変更して、その依存関係を削除して再作成することはできますか?依存関係を削除しないでデータ型を変更する方法

私は次のことを試してみました:

EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL" 

ALTER TABLE dbo.MyTable 
    ALTER COLUMN MyColumn DECIMAL(10, 3) NULL 

EXEC sp_MSforeachtable @command1="ALTER TABLE ? CHECK CONSTRAINT ALL" 

私はこのクエリを実行すると、私はエラーメッセージを取得:

メッセージ5074、レベル16、状態1、行8
オブジェクトのMYVIEW 'は列' MyColumn 'に依存します。

メッセージレベル5074、レベル16、状態1、行8
インデックス 'MyIndex'は、列 'MyColumn'に依存します。

メッセージ4922、レベル16、状態9、行8
ALTER TABLE ALTER COLUMN 1つ以上のオブジェクトがこの列にアクセスしたため、MyColumnが失敗しました。

依存関係を削除したり再作成したりせずに変更することはできますか?

ありがとうございます。

+1

http://stackoverflow.com/questions/1258380/preserve-sql-indexes-while-altering-column-datatype –

+1

いいえ、**それを行うことが可能**ではありません。 –

答えて

1

これを行う方法が見つかりました。

SQL Server Management StudioでTools -> Options -> Designerに移動し、のチェックボックスをオフにします。「必要な変更を保存しないようにしてください」というメッセージが表示されます。

次に、カラムのデータ型を変更するテーブルを右クリックし、「デザイン」をクリックします。

デザイナーでは、必要な列データ型を編集します。

最後に、右クリックして"Generate Change Script"を選択します。テーブル

  • 列の新しいデータ型で一時テーブルへ
  • 再度追加の制約を一時テーブルを作成します。上の

    • ドロップ制約:それは何


      は以下のとおりです。

    • 一時表のIDENTITY_INSERTON
    • に設定します。
    • コピーOFF
    • ドロップ古いテーブル
    • に一時テーブル上のIDENTITY_INSERT設定し、新たな一時テーブル
    • に、古いテーブルからすべてのデータが古いテーブルの名前に一時テーブルの名前を変更し
    • インデックス
    • 再度追加に外部キー制約を再作成し、主キー制約を再度追加

    また、すべての依存するビューを更新する必要があります。 このスクリプトでステートメントを生成することができます。

    SELECT DISTINCT 'EXEC sp_refreshview ''' + s.name + '.' + so.name + '''' AS 'dbo.TABLENAME' 
    FROM sys.objects AS so 
    INNER JOIN sys.sql_expression_dependencies AS sed 
        ON so.object_id = sed.referencing_id 
    INNER JOIN sys.schemas AS s 
        ON so.schema_id = s.schema_id 
    WHERE so.type = 'V' AND sed.referenced_id = OBJECT_ID('dbo.TABLENAME'); 
    
    • が、このことについて注意してくださいTools -> Options -> Designer

    で「テーブルの再作成が必要に防ぐ変更を保存」のボックスをチェックしてください!それが本当にあなたが探しているものかどうかを確認してください。これは古いテーブルを削除することに注意してください。 これを開発環境でテストしてください!

  • +0

    質問:テーブルを削除してすべての制約で再作成するのは、制約を削除し、列を変更して制約を再作成するよりも優れていますか? – Pred

    +0

    良い質問ですが、私はSql Server Management Studioが生成するスクリプトについてのみ説明しました。私たちは多くのテーブルでそれをやらなければならなかったので、スクリプトを作成する方法が必要でした。しかし、あなたはおそらく正しいでしょう、これは同様にうまくいくでしょう – xeraphim

    関連する問題