2013-10-11 26 views
3

新表已添加到表中,但新列未添加到表定義(最右邊一列)的末尾,而是添加到表的中間。數據丟失警告在表中間添加列

Table differences

當我嘗試在展鵬SQL源控制犯,我得到了警告,「這些變化可能會導致數據丟失」

  • 威爾數據丟失真的occurr?
  • 有沒有辦法預覽更改腳本以確認沒有數據會丟失?
    • 我可以複製腳本,輕鬆地把它變成一個遷移V2腳本?
  • 請問我只是
    • 編輯在SSMS表並移到新列到最後
    • 或寫遷移腳本?
  • 如果是這樣,有沒有方便的工具做重複的東西?

回答

3

鋒線上披露,我對SQL源代碼控制紅門工作。

該更改將需要重新創建表。默認情況下,SSMS不會讓您保存該更改。但是,該選項必須已在SSMS中禁用。它位於工具 - >選項 - >設計器 - >表格和數據庫設計器 - >防止保存需要重新創建表格的更改。

鑑於功能則禁用SQL源控制回升,截至作爲一個潛在的數據丟失的情況,並提示是否要添加一個遷移腳本。

如果你的團隊中的其他開發人員通過獲得最新的拉這種變化,那麼SQL源代碼控制將讓他們瞭解更多的細節的任何潛在的數據丟失,這取決於它們的本地數據庫的當前狀態。如果唯一的變化是將列添加到現有的表中,那麼這不會將數據放在未更改的列中。

如果您正在部署到另一個數據庫(例如staging/UAT/prod),並且您有SQL Compare,那麼您可以使用它來準確查看將應用於數據庫的內容,如果嘗試在另一個非本地數據庫。選擇創建部署腳本選項,您可以在運行前仔細檢查SQL。

正如你所說添加列到表的末尾將避免需要進行重建,所以很可能是爲了避免這一點,如果你並不需要擔心其中一列是最簡單的方法。

或者你可以添加一個遷移腳本:

  1. 使用一個臨時名稱
  2. 複製現有的數據到臨時表
  3. 除去現有的表創建具有新的結構的新表
  4. 重命名新的臨時表的原始名稱

你提到遷移V2,該測試版功能ŧ改變了遷移的工作方式,以便更好地支持分支和合並以及DVCS系統。請參閱http://www.red-gate.com/migrations

版本1遷移腳本需要進行一些修改才能轉換爲v2遷移腳本。這是一個相當微不足道的變化。目前,我們正在編寫此文檔,如果您希望瞭解有關此更改的更多信息,請聯繫Google集團。 https://groups.google.com/forum/#!forum/red-gate-migrations

+0

感謝喬恩。看起來像當你在SSMS中得到警告,表將被刪除,並且你可以選擇查看SSMS重新創建腳本時,這個腳本應該被保存,然後變成一個遷移腳本。 –

1

我使用SSMS將列移動到表的末尾以否定遷移腳本的需要。

在類似的情況下,移動列不方便,這是我將SSMS腳本轉換爲Migrations V2腳本所做的。

  • 撤消SSMS(刪除列)的變化
  • 重做SSMS的變化,但不是節約的變化直接到數據庫中,我保存更改腳本
  • 修改了更改腳本
    • 修剪SSMS交易&環境包裝
    • 新增保護條款:如果COL_LENGTH( 'MyTable的', 'MyColumn')IS NULL
    • 包裹腳本BEGIN TRAN - ROLLBACK TRAN測試腳本,而不弄髒數據庫
    • 替換GO與END BEGIN
    • 回滾事務中測試
    • 刪除BEGIN TRAN - ROLLBACK TRAN發展包裝

Visual diff of converting SSMS to Redgate

0

下面是簡單的SQL查詢,這將有助於不會丟失數據插入數據庫表列。

讓說CCDetails就是我們只想Sys_CreatedBy列前插入列GlobaleNote表:

declare @str1 nvarchar(1000) 
declare @tableName nvarchar(1000) 
set @tableName='CCDetails' 
set @str1 = '' 
SELECT @str1 = @str1 + ', ' + COLUMN_NAME 
FROM Information_Schema.Columns 
WHERE Table_Name = @tableName 
ORDER BY Ordinal_Position 
set @str1 = right(@str1, len(@str1) - 2) 
set @str1 = 'select ' + @str1 +' into '[email protected]+'Temp from '[email protected]+' ; Drop Table '+ @tableName + ' ; EXEC sp_rename '[email protected]+'Temp, '[email protected] 
set @str1 = REPLACE(@str1,'Sys_CreatedBy','CAST('''' as nvarchar(max)) As GlobaleNote , Sys_CreatedBy') 

exec sp_executesql @str1 
相關問題