2011-12-01 65 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)的情况下完成更改,或者是否需要创建新的对象和复制值从旧的(它自动执行)。

计划一个小小的工作来了解如何将其融入到您的特定环境和工作流程中,但我发现这项工作非常值得。