2011-12-01 129 views
2

我正在處理腳本以保持表架構同步。架構更改表重建

是否有對MS SQL中的表模式執行的操作的詳盡列表,這些操作要求刪除並重新創建表並重新插入數據?

+0

你是什麼意思「重建?」丟棄並重新創建? –

+0

是的,丟棄,重新創建和重新插入數據。 – Darthg8r

回答

3

在標準化CREATE-COPY-DROP-RENAME(CCDR)策略時,您可能會更好,並且只在少數情況下嘗試進行原地更改,其中DDL不需要重建,而不是嘗試編譯窮舉名單。這是此處描述的策略:link

AFAIK,你只允許將列添加到現有的表(沒有重建)如果該列是:

  1. 添加到表AND
  2. 的端部可爲空的或具有默認約束

在其他情況下,MSSQL會可能失敗,如果它不知道在新添加的列或數據行的值用什麼損失是一個結果(例如截斷)。即使是在中間加入的違約列也會強制重建。

使事情進一步複雜化,在某些情況下,部署的成功取決於表中的數據類型,而不僅僅是涉及的模式。例如,將列長度更改爲更大的值(varchar(50) --> varchar(100))可能會成功;然而,減少長度只有有時允許。遷移數據類型變化是另一個棘手的問題。

總之,我會總是重建和很少改變到位。

-

爲了說明行數據影響結果:

create table dbo.Yak(s varchar(100)); 
insert into dbo.Yak 
    values(replicate('a', 100)); 
go 

-- attempt to alter datatype to 50 (FAIL: String or binary data would be truncated.) 
alter table dbo.Yak 
    alter column s varchar(50); 
go 

-- shorten the data in row to avoid data loss 
delete from dbo.Yak; 
insert into dbo.Yak 
    values(replicate('a', 50)); 
go 

-- again, attempt to alter datatype to 50 (SUCCESS) 
alter table dbo.Yak 
    alter column s varchar(50); 
go 

select len(s),* from dbo.Yak; 
go 

--cleanup 
drop table dbo.Yak; 
go 
+0

這是一個很棒的閱讀。做得好。 – Darthg8r

1

在Management Studio中,選擇要更改的表並右鍵單擊設計。更改表格設計窗口中列的數據類型(用int測試錢)。

不是保存,而是在窗口中右鍵單擊並選擇「生成更改腳本」。複製對話框中的SQL語句。

*)在以前的版本(SQL2000)中,任何更改都會重新創建整個表格(據我所知)。看來,重命名和添加列已針對ALTER TABLE語句進行了優化。

+0

是的,這是如何找出來的;但是,問題是如何去做 – zanlok

1

我通過使用Visual Studio數據庫項目來管理這樣的事情變得非常溺愛。一旦我的模式被導入到項目中,我可以進行任何我想要的更改,並且VSDP將確定是否可以在不刪除對象(例如使用ALTER)的情況下完成更改,或者是否需要創建新的對象和複製值從舊的(它自動執行)。

計劃一個小小的工作來了解如何將其融入到您的特定環境和工作流程中,但我發現這項工作非常值得。