我应该如何组织我的主ddl脚本

我目前正在为我们的数据库创建一个主ddl。从历史上看,我们使用备份/恢复来修改我们的数据库,而不是维护任何ddl脚本。该模式非常大。

我目前的想法:

  • Break script into parts (possibly in separate scripts):

    1. table creation
    2. add indexes
    3. add triggers
    4. add constraints
  • Each script would get called by the master script.

  • I might need a script to drop constraints temporarily for testing
  • There may be orphaned tables in the schema, I plan to identify suspect tables.

任何其他建议?

编辑:另外,如果有人知道自动化过程的一部分的好工具,我们正在使用MS SQL 2000(老,我知道)。

0

7 答案

我以前组织过每个实体组织一个文件组成的DDL代码,并将其组合成一个DDL脚本。

我的前任雇主使用了一种方案,其中所有的表DDL都在一个文件中(存储在oracle语法中),在另一个文件中指示,第三个中的约束和第四个中的静态数据。这个变更脚本与Oracle保持并行(再次在Oracle中)。转换为SQL是手动的。这是一团糟。我实际上编写了一个方便的工具,将Oracle DDL转换为SQL Server(它的工作时间为99.9%)。

我最近转而使用 Visual Studio Team System for Database专业人员。到目前为止,它工作正常,但如果你在数据库中使用CLR函数有一些小故障。

0
额外

@亚当

或者,如果只是域 - 在同一个文件中有用的相关表的分组,但是与其他的分开?

唯一的问题是如果某些域(在这个有点遗留的系统中)紧密耦合。另外,您必须保持不同子脚本之间的依赖关系。

0
额外

你在那里有什么似乎很好。我的公司有时候为了获得足够大的数据库,将其分解得更细一些,或许是针对单个对象层面的。这样每个表/索引/ ...都有它自己的文件。可以是有用的,可以矫枉过正。真的取决于你如何使用它。

@Justin

通过域大多总是足够的。我同意这样做时需要处理一些复杂问题,但这应该很容易处理。

我认为这种方法提供了更多的分离(在一个大型数据库中你会欣赏到),同时仍然使它本身非常易于管理。我们也编写了Perl脚本来完成这些DDL文件的大量处理,所以这可能是一种处理这种情况的好方法。

0
额外

如果您正在寻找自动化工具,我经常使用EMS SQLManager,它允许您从数据库中自动生成ddl脚本。

在将数据库放在线上之前,参考表中的数据插入可能是强制性的。这甚至可以被认为是ddl脚本的一部分。 EMS还可以生成用于从现有数据库插入数据的脚本。

在ddl阶段可能无法正确估计索引的需求。你只需要声明他们的主键/外键。其他索引应该稍后创建,一旦定义了视图和查询

0
额外

投入时间编写一个通用的“删除所有约束”脚本,因此您不必维护它。

以下语句的游标可以实现这个功能。

Select * From Information_Schema.Table_Constraints 

Select * From Information_Schema.Referential_Constraints
0
额外

我认为基本的想法很好。

关于先构建所有表然后再构建所有约束的好处是可以按任何顺序创建表。当我完成这个操作时,每个表格都有一个文件,我把它放在一个名为“Tables”的目录中,然后是一个执行该目录中所有文件的脚本。同样,我也有一个用于约束脚本的文件夹(它们也执行外键和索引),这些脚本在构建表之后执行。

我将分离触发器和存储过程的构建,并最后运行它们。关于这些的关键是它们可以在数据库上运行并重新运行而不会影响数据。这意味着您可以像普通代码一样对待它们。您应该在每个触发器和过程脚本的开始处包含“if exists ... drop”语句,以使它们可重新运行。

所以顺序是

  1. 创建表
  2. 添加索引
  3. 添加约束

然后

  1. 添加触发器
  2. 添加存储过程

在我目前的项目中,我们使用MSBuild来运行脚本。有一些扩展程序目标,您可以通过它获取它,以便调用sql脚本。在过去,我使用的perl也很好(还有批处理文件......我不会推荐 - 这太有限了)。

0
额外
我也有类似的环境,我使用MSBuild控制脚本执行。它还允许我在适当的地方包含数据加载脚本。例如,我可以将样本数据加载到数据库的测试或演示副本中。
额外 作者 bobs,
这并不总是那么容易,可以在一个表上有一个计算列,计算是在一个函数中完成的。大多数函数依赖于表,但具有计算列的表取决于函数。所以,如果你先尝试一个“先表,然后限制,然后功能然后查看”,你会发现你有一个问题。
额外 作者 David Roussel,

there is a neat tools that will iterate through the entire sql server and extract all the table, view, stored proceedures and UDF defintions to the local file system as SQL scripts (Text Files). I have used this with 2005 and 2008, not sure how it wil work with 2000 though. Check out http://www.antipodeansoftware.com/Home/Products

0
额外