web-dev-qa-db-ja.com

Visual Studio 2013データベースプロジェクトドロップ列

データテーブルにデータの行があるときに、データベースから既存の列を削除する最良の方法を誰もが知っていますか。

私が試したことはうまくいきたくないようです。データベースプロジェクトに事前展開スクリプトを含めました。

GO
if exists(select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'Mercury.dbo.Discounts' and COLUMN_NAME = 'ColumnToRemove')
BEGIN
    ALTER TABLE Database.dbo.Table1 Drop Column ColumnToRemove
END
GO

次に、最初にテーブルを作成したスクリプトで、テーブル作成スクリプトから問題の列を削除しました

Dacpacの実行が完了すると、次のようになります

Initializing deployment (Start)
*** The column [dbo].[Table1].[ColumnToRemove] is being dropped, data loss could occur.
Initializing deployment (Complete)
Analyzing deployment plan (Start)
Analyzing deployment plan (Complete)
Updating database (Start)
An error occurred while the batch was being executed.
Updating database (Failed)
*** Could not deploy package.
Warning SQL72015: The column [dbo].[Table1].[ColumnToRemove] is being dropped, data loss could occur.
Error SQL72014: .Net SqlClient Data Provider: Msg 50000, Level 16, State 127, Line 6 Rows were detected. The schema update is terminating because data loss might occur.
Error SQL72045: Script execution error.  The executed script:
IF EXISTS (SELECT TOP 1 1
           FROM   [dbo].[Table1])
    RAISERROR (N'Rows were detected. The schema update is terminating because data loss might occur.', 16, 127)
        WITH NOWAIT;    
36
DRobertE

私はそれが古いスレッドであることを知っていますが、同じ問題に直面していたときにこのスレッドに出会いました。

ここに私のために働いたものがあります:

VSでDBプロジェクトを右クリックすると、「データベースの公開」ダイアログが表示されます。ターゲットサーバー接続をセットアップし、正しいデータベースを選択します。

次に、「詳細設定...」ボタンをクリックして「公開設定の詳細設定」を開きます。

1) Uncheck - 'Block incremental deployment if data loss might occur' checkbox.
2) Check - 'DROP objects in target but not in project'

クリック OK ボタン。次にクリック Generate Script 公開スクリプトを生成するためのボタン。

スクリプトを頻繁に生成する場合は、これらの設定をプロファイルファイルに保存できます。

50
beastieboy

データベースプロジェクトのプロパティを変更する必要があります

  1. プロジェクトのプロパティに移動
  2. デバッグタブ
  3. 以下の図のように、このオプション「データ損失が発生する可能性がある場合は増分展開をブロックする」のチェックを外します

23
feras damra

私の状況では...

Visual Studio 2015でのスキーマ比較の使用。[スキーマ比較]ウィンドウを開いた後:

  1. スキーマ比較オプション(メニューストリップの小さな歯車アイコン)。
  2. [全般]タブに移動します
  3. チェックを外しますデータ損失の可能性をブロック

これは、セッション中はチェックされません。セッションを終了するときにチェックされたままであるかどうかは確認しませんでした。

3
Scooter

プロジェクト関連の理由で「データの損失が発生する可能性がある場合は増分展開をブロックする」のチェックを外せない場合は、展開前および展開後のスクリプトをノックアップして、変換を有効にすることができます。アップグレードされたテーブルの列のいずれかに依存関係がある場合、これは以下よりもはるかに複雑になります。

展開前スクリプトの例:

IF EXISTS (SELECT *
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA = 'YourSchema'
    AND TABLE_NAME = 'YourTable'
    AND COLUMN_NAME = 'ColumnToBeDropped')
BEGIN

    CREATE TABLE [Upgrade].[YourTable](
        [YourTableId] [int] NOT NULL,
        [KeepThisColumn] [money] NOT NULL)

    INSERT INTO Upgrade.YourTable
    (YourTableId, KeepThisColumn)
    SELECT YourTableId, KeepThisColumn
    FROM YourSchema.YourTable

    TRUNCATE TABLE YourSchema.YourTable

END

次に、データベースプロジェクトは、データベースから削除する列を削除します。

データを実際のテーブルに戻すには、ポストデプロイスクリプトが必要です。デプロイ後スクリプトの例:

IF EXISTS (SELECT *
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = 'Upgrade'
    AND TABLE_NAME = 'YourTable')
BEGIN

    SET IDENTITY_INSERT YourSchema.YourTable ON

    INSERT INTO YourSchema.YourTable
    (YourTableId, KeepThisColumn)
    SELECT YourTableId, KeepThisColumn
    FROM Upgrade.YourTable

    SET IDENTITY_INSERT YourSchema.YourTable OFF

    DROP TABLE Upgrade.YourTable

END
2
Giles Roberts

プロジェクトで1回だけ実行する必要があり(事前展開スクリプトではなく)、公開するときに、「データの損失を許可する」オプションを使用する必要があります。列を削除する場合、データ損失の可能性を回避する方法がわかりません。これが完了したら、いつでもその設定を元に戻すことができます。

0
Peter Schott