在SQL Server Express中生成数据库脚本

时间:2009-12-16 22:02:53

标签: sql-server database sql-server-express

我为我的数据库生成更改脚本以使其保持在源代码控制之下,每次都会发生奇怪的事情:

我有一个FlowFolder表,点击Generate Scripts会创建以下两个脚本:

dbo.FlowFolder.Table.sql

USE [NC]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[FlowFolder](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ParentId] [dbo].[ParentId] NULL,
    [ParentType] [dbo].[CLRTypeName] NOT NULL,
    [Name] [dbo].[EntityName] NOT NULL,
    [Description] [dbo].[EntityDescription] NULL,
    [LastChanged] [int] NULL,
 CONSTRAINT [PK_FlowFolder] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,
       ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO

DF\_FlowFolder_LastChanged.Default.sql

USE [NC]
GO
ALTER TABLE [dbo].[FlowFolder] ADD CONSTRAINT [DF_FlowFolder_LastChanged]  
            DEFAULT ((0)) FOR [LastChanged]
GO

问题

  1. 为什么SQL Server Express会生成两个文件?
  2. 为什么不将此约束作为DEFAULT(0)属性放在LastChanged
  3. CREATE TABLE statement?字段中
  4. 如何强制SQL Server为每次更改生成合并脚本而不是将其拆分?
  5. 修改

    我们如何生成脚本。起初,它只是一个文件。但是,不幸的是,SQLEXPRESS没有将数据库实体的顺序从保存保存到保存。这意味着,即使模式中的一个小变化也可能导致脚本与前一个版本大不相同。如果想要比较模式中的差异,这是非常不方便的。因此我们采用了另一种方法我们为每个数据库实体生成脚本(不是数据,而是模式实体,如表,用户类型等等),然后应用一个小实用程序,删除SQLEXPRESS在每个文件中插入的注释,说明生成日期。之后,可以清楚地看到哪些模式实体已从修订版更改为修订版。

    总之,我们必须为每个模式实体生成脚本。

    关于DEFAULT(0)约束 - 我们实际上不需要将它们命名为约束,因此将它们放在列定义上就可以了。

1 个答案:

答案 0 :(得分:1)

  1. 您是否在向导的输出选项面板上选择了“每个对象的文件”?
  2. 因为在CREATE TABLE
  3. 中嵌入约束名称时无法提供约束名称
  4. 确保在输出选项面板上选择“单个文件” - 或尝试“脚本到新查询窗口”
  5. 不幸的是,您正在寻找的功能不存在。

    所有约束都给出了名称 - 即使是未命名的约束也会给出名称。 SQL Server不会跟踪它创建的名称以及您创建的名称,因此在脚本生成过程中,它必须将它们拆分。

    通常,反向管理此过程会更好。换句话说,将一组脚本文件组合在一起以创建数据库。这样,您可以根据需要构建脚本文件。 Team System Data Edition会自动为您完成此操作。常规数据库项目允许您将它们分开,但它在部署方面的工作量更大。