架构更改表重建

时间:2011-12-01 16:00:24

标签: sql-server schema

我正在编写一个脚本来保持表模式同步。

是否有详尽的MS SQL表模式操作列表,需要删除和重新创建表以及要重新插入的数据?

3 个答案:

答案 0 :(得分:3)

您可能最好不要在CREATE-COPY-DROP-RENAME(CCDR)策略上进行标准化,并且只在您的DDL不需要重建而不是尝试编译详尽列表的几个场景中尝试就地更改。这是此处描述的策略:link

AFAIK,如果列是:

,则只允许您向现有表添加列(无需重建)
  1. 添加到表格 AND
  2. 的末尾
  3. 可以为空或具有默认约束
  4. 在所有其他情况下,如果MSSQL不知道在新添加的列的行中使用什么作为值,或者数据丢失是结果(例如截断),则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
    

答案 1 :(得分:1)

在Management Studio中,选择要更改的表,然后右键单击“设计”。更改表设计窗口中列的数据类型(使用int测试为money)。

而不是保存,右键单击窗口并选择“生成更改脚本”。从对话框中复制SQL语句。

*)在以前的版本(SQL2000)中,任何更改都会重新创建整个表(据我记得)。似乎重命名和添加列已针对ALTER TABLE语句进行了优化。

答案 2 :(得分:1)

通过使用Visual Studio数据库项目来管理这类事情,我已经变得非常糟糕。将模式导入项目后,我可以进行任何我想要的更改,VSDP将确定是否可以通过删除对象(例如,使用ALTER)来完成更改,或者是否需要创建新对象和复制值从旧对象(它自动执行)。

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