数据库开发
介绍 VSTS Database Edition GDR 中的新功能
Jamie Laflen and Barclay Hill
本文讨论:
|
本文涉及以下技术: VSTS 2008 Database Edition GDR |
内容
脱机架构开发
内容
数据库管理
内容
产品体系结构的更改
内容
介绍 Server 项目
内容
服务器项目引用
内容
共享的服务器级别对象的引用
内容
系统对象的引用
内容
项目升级
内容
新的数据库项目生成和部署
内容
命令行设备,VSDBCmd
内容
SQL CLR 项目支持
内容
静态代码分析改进
内容
Tips 和技巧
内容
在 11 月 2008 Microsoft Visual Studio Team 系统 2008 (VSTS) 数据库 Edition 发布此常规分发版本 (GDR)。该 GDR 安装 VSTS 2008 数据库 Edition,最初发布的顶部,但是超过了次要版本升级。该 GDR 添加 SQL Server 2008 的支持、 合并了现有功能的改进,包括许多新增的功能和扩展点和合并电源工具以前发布的功能。
本文,我们重点突出显示此种 GDR 包括其支持脱机架构开发,新功能支持开发一个的数据库架构时可以使用的新流程和支持数据库管理的功能的工具。
除了这些过程的改进 VSTS Database Edition GDR 还提供以下功能:
- 解释并评估项目的架构和相互依赖关系。脱机处理使开发人员可以捕捉进行部署前的语法和引用错误。
- 重构,通过使用 VSTS Database Edition 以,您可以更改的对象 (如表或列),名并该更改将更新为新名称的所有引用。
- 自动差分引擎,在部署项目时, 生成包含仅必要的更改使匹配源在目标数据库的 Transact-SQL (T-SQL) 脚本。
- 数据库单元测试,您可以使用设计器,使 T-SQL 面向测试试验,并验证您的架构才能签入您的代码的开发。
- 测试数据生成,您可以使用此工具生成运行单元测试时使用的伪随机的实际测试数据。
随功能的说明这些功能提供,您可以找到一些动手示例中显示它们的。
脱机架构开发
以前,数据库架构开发具有需要编写代码对共享的开发服务器,并且然后编写将更改从一个环境迁移到另一个的更新脚本。此方法不提供跟踪和合并的数据库对象的更改的进行移动的更改,从一个环境到另一个非常手动过程的任何方法。
VSTS 中 Database Edition,组成您的架构的对象 (如表、 存储的过程和视图) 在 Visual Studio 数据库项目中管理为 CREATE 脚本。将这些对象存储为脚本意味着,您可以管理通过源代码控制系统脚本,并允许多个数据库开发人员可以同时编辑脚本,然后合并它们根据签入更改时。编辑脚本文件,而没有连接到数据库的过程称为脱机架构开发。您的数据库的定义已被 Live 数据库中移动到脱机 / 建模环境,数据库开发人员可以应用所做的应用程序开发 leaner 和较少成本高的灵活性或迭代开发实践。
数据库开发人员可以开始开发脱机方法是: 在 Visual Studio 中创建数据库项目时然后将当前开发数据库导入到项目。导入的项目可能引发某些的警告但您清理警告,并成功生成该项目之后,可以检查其到您的源代码控制系统。
项目和源代码签入后,您的团队开发人员可以检索项目和源代码以及其本地计算机上。更改立即部署到本地的沙箱数据库和手动测试。此方法允许开发人员以隔离方式工作时不在共享的数据库环境中引入不稳定。您可以通过编写一个或多个数据库单元测试以验证更改改进这种方法。一旦更改已经过验证,对在沙箱数据库中运行所有在单元测试的验证不只在修改代码但也有的更改不中断任何其他代码。后传递测试,检查源代码控制系统变为。
当更改签入,并且准备好团队时,可以通过从源代码控制系统中获取源中执行生成。一旦建立,然后可以与环境的用户可以启动新开发产品所使用的应用程序代码一起部署数据库。
数据库管理
VSTS 数据库 Edition 提供了有助于管理数据库时执行的常见任务的几个工具。一个类工具是自动进行比较和更新架构的任务的架构比较。您可以使用架构比较来比较两个数据库,,然后生成一个更新脚本,可以创建、 更改,或目标数据库中删除对象。如果更改需要进行直接在正常的部署进程外的实时数据库,您可以使用架构比较比较数据库脱机数据库项目,,然后将任何更新导入回到被签入到源代码管理数据库项目。
架构比较工具在 GDR 中有的新功能的许多。大多数 notable 是使用会话之间保留比较设置和选项的能力。(比较结果不会保存,只是选项和设置)。
能够保留设置和选项的项目系统,文件在.scmp,该文件存储的项目系统架构比较文件夹中默认情况下进行了新的文件类型。多个架构比较文件可以被创建,并且保存在项目中。您也可以保存在架构比较设置 without 数据库项目保留比较设置通常用于疑难解答或其他操作的原因。
架构比较现在还提供了可从该架构的会话级选项设置比较 图 1 所示工具栏。您可以筛选排除比较的特定对象类型的对象,在项目中定义的 SQLCMD 变量可以被替换为比较,且脚本选项可以定义控制如何更新脚本创建的。所有这些选项可以保存.scmp 文件中。
图 1 架构比较选项
在架构比较对象工具栏提供之间比较每个架构差异的轻松导航。您可以筛选类型的新视图、 缺少不同,等于,或这些类型的组合的差异。架构比较还支持比较.dbschema 文件。现在可以比较在项目、 数据库和.dbschema 文件的任意组合。如果目标是.dbschema 文件不能使用此版本,但所有其他组合的写入更新支持比较和写入目标的更新。
VSTS 数据库 Edition 还提供了一种更易于比较两个数据库系统中的这些数据的工具。通过数据比较管理员可以比较具有主 / 唯一键和检测丢失、 额外,或其他数据位于两个系统的表。像架构比较,Data Compare 可以生成一个脚本,将更新直接写入目标系统,使其匹配源系统的数据的数据。
产品体系结构的更改
该 GDR 引入了许多关键的体系结构更改。最重要方式之一是真正的模型表示形式的 SQL Server 数据库。
VSTS 的以前版本中 Database Edition,需要 SQL Server 2005 的一个设计实例。项目系统将作为最终验证步骤设计实例用于数据定义语言 (DDL) 脚本在数据库项目中。这需要每个开发人员已 SQL Server 他或她的桌面的本地运行的实例,或为了构建的数据库的脱机表示生成计算机。
与该的 GDR 设计实例不再是必需,,项目系统支持数据库架构的完全模拟表示形式。该 GDR 生成模型表示 SQL Server 数据库从您的数据库项目中的 DDL 脚本,并提供模型可用在 Visual Studio 中的所有数据库工具。生成数据库项目生成的模型的序列化的 XML 表示形式的.dbschema 文件。数据库项目的部署生成部署脚本与从目标数据库创建模型基于项目的生成输出的比较的。
项目的使用会话,之间数据库项目的模型保持项目的根目录下.dbml 文件中。.dbml 文件提供以加速打开,并具有更大的架构的现有数据库项目的生成模型的一个缓存。
模型是由数据库架构提供程序 (DSPs) 实现的。该 GDR 包括一个用于每个受支持的版本,SQL Server 的三个 DSPs SQL Server 2008,为 SQL Server 2000 和以及 SQL Server 2005,as in 以前的版本。与一个基于提供程序的模型的 VSTS 数据库 Edition 版本现在分离从 SQL Server 的版本。在发布 SQL Server 一个新版本或 Service Pack 更新现有的版本新功能或语法时, 可以将发布新的或更新的 DSP SQL Server 功能支持这些更改。在将来的 Visual Studio Team System 的版本,此基于提供程序的模型将使第三方扩展 VSTS 数据库版本的项目的环境支持其他数据库平台。
介绍 Server 项目
在的 GDR 提供一个新功能的服务器项目使团队可定义一个独立的项目是其 SQL Server 数据库的服务器级配置。主服务器项目的旨在共享的预期的配置和数据库项目之间的对象。服务器项目可以被多个数据库项目引用而不复制服务器对象定义。是例如您可能三个的数据库项目每个表示在目标服务器上的用户数据库。其中这些数据库项目的每个应该有引用相同的服务器项目,以确保目标数据库服务器的配置保持一致。
Server 项目中定义该服务器配置设置用于验证目的在部署,虽然没有实际更改时部署的服务器配置。部署,过程中验证服务器的配置与预期的 Server 项目中所述的配置匹配。如果配置验证失败 Server 项目中指定,请部署将失败并且不会更改共享的服务器级对象或用户数据库。
在 Server 项目中配置服务器设置,您更改该 server.sqlsettings 文件服务器项目的属性文件夹中找到。(您可以参考 SQL Server 联机丛书版本的 SQL Server 用于说明什么每个服务器设置不会)。 服务器设置的示例如 图 2 所示。
图 2 Server 项目的服务器设置的示例
默认,没有服务器设置验证部署过程中。若要将验证部署过程中设置选中验证复选框中,值列中配置在预期值。
服务器项目引用
引用服务器级对象的数据库项目中的对象需要服务器级对象定义。建模 Server 项目中的在服务器级对象,可以从您的数据库项目中引用这些对象。对于是实例如果数据库项目定义了一个登录用户,您需要创建模型服务器级登录所需的用户在数据库项目中的 Server 项目。如果您只使用系统对象,并且没有共享的服务器级对象,则可以只需添加对 master.dbschema 文件随该 GDR 安装一个引用。
共享的服务器级别对象的引用
服务器项目为模型具有不同的行为和比用户数据库级别对象的作用域的共享的服务器级对象提供支持。无效的服务器级对象引用标记的项目的数据库中的对象,并且到服务器项目与每个被跟踪的后无法解析由错误或警告的引用。
共享的服务器级对象的常见示例是一个登录名。通过引用 Server 项目中的登录对象定义数据库项目中的用户对象时,多个用户数据库可以使用相同的登录名。如果必须引用一个登录名的数据库项目中定义的用户对象,必须建立对服务器项目登录所在将完全解析数据库项目中用户对象的一个数据库引用。如果不是,您将收到类似于 图 3 所示的验证错误。
图 3 验证错误的一个示例
若要引用 Server 项目中的对象,首先创建一个服务器项目,代表在 master 数据库。Server 项目是从可以新建项目对话框的数据库项目节点下找到的服务器项目模板创建的。有三个 Server 项目模板,另一个用于每个 SQL Server 的受支持版本。如果目标服务器已存在可以目标服务器的主数据库导入到一个新的服务器项目。将导入服务器中的任何用户定义对象。接下来,生成以确认没有问题存在,并且创建模型服务器的.dbschema 文件服务器项目。
在您的数据库项目中您通过建立新的数据库引用来引用服务器项目。在下面的示例我 Server 项目 (MyServer) 和数据库项目 (MyDatabase) 中有相同的解决方案。通过右键单击 MyDatabase 项目在解决方案资源管理器的数据库引用文件夹,然后单击添加数据库引用创建一个的数据库引用。您将看到对话框框 图 4 中的显示。
图 4 添加数据库引用对话框
为此类型的引用中,您应该接受默认设置添加数据库引用对话框中显示。使用文字母版允许引用对象 (如表) 在 master 数据库中存在的作为三部分名称的一部分包括母版文本将数据库对象 (如存储过程)。如果您有无法解析服务器级别对象的引用错误,它们应解决通过新的引用。图 5 创建引用后,在解决方案资源管理器显示 MyDatabase 项目的数据库引用。
图 5 </a0>-MyDatabase 引用
系统对象的引用
如果数据库项目中使用系统对象,对主数据库的引用是还必需的。系统对象的一个示例是系统存储过程、 系统表、 系统视图或系统目录。常用用户数据库中的系统对象是 sysobjects 视图。是例如查看存储的过程中所示 图 6 ,使用 sys.sysobjects 和 sys.schemas 系统视图。不到包含这些对象定义的主数据库引用生成多个警告,表示存储过程中使用的系统对象无法解析。因为存储的过程允许延迟的名称解析,它们未解析的引用的警告。视图定义中的此同一 SELECT 语句将产生错误。
图 6 的警告和对 aMaster 数据库引用没有出现错误
要删除这些警告,您必须创建对包含这些对象的定义的主数据库的引用。但是,引用系统对象并不会要求 Server 项目。请记住,Server 项目包含对象和已定义的设置。若要引用包含系统对象的 master 数据库,您将引用 master.dbschema 文件来解决系统对象的引用。若要创建到 master.dbschema 文件引用,定义数据库引用,在如前面显示,相同的方式,但而不是引用一个项目,引用.dbschema 文件。可以在以下目录中找到 master.dbschema 文件:
"%programfiles%\Microsoft Visual Studio 9.0\VSTSDB\Extensions\SqlServer\ <SQL Version>\DBSchemas"
有七个.dbschema 文件随 GDR 两个的 SQL Server 的每个受支持版本和其他 dbschema 文件为 SQL Server 2008 中新的 SQL 类型。请注意每个受支持的版本,SQL Server 的有相应的 master.dbschema 和 msdb.dbschema 文件。它也是项目的值得注意当您创建对 master.dbschema 文件的引用,您模型可以有点时要更新,因为这些.dbschema 文件中包含所有对象定义主控形状中的目标的 SQL Server 版本的数据库。最后,则还可以将对服务器项目的引用和对静态 master.dbschema 文件的引用,因为它们用途不同。两个引用将使用母版的文本。
项目升级
如果您正在与在 VSTS 数据库之前在 GDR 版本的版本中创建某个项目,需要移动您在预生成和部署后的脚本中创建到一个新的服务器项目的任何服务器级对象。项目升级过程中将预生成和部署后的脚本中定义的任何服务器对象移动到名为它位于名为升级在根项目文件夹的子文件夹中的 upgraded.AllServerObjects.sql 脚本文件。可以使用导入的脚本命令导此脚本文件入到新创建的 Server 项目。要解决任何引用错误或警告,请从数据库项目创建引用到您的新服务器项目。
新的数据库项目生成和部署
如果您认为有关数据库部署,几个方案有立即想到:
- 大多数的 IT 组拥有部门应用程序的生成必须移动生产环境和最终用户在达到之前的多个环境。
- 软件供应商记住具有目标数据库架构,如果他们发布的更新,但他们希望能够正常更新可能与以前版本的架构不匹配的客户的架构。
这些方案是便于管理生成版本因为 T-SQL 部署脚本输出数据库项目时的 VSTS 数据库的以前版本中。生成输出生成差分数据库项目和目标实例 (或设计数据库实例) 上的数据库和然后编写一个脚本,将更新为"类似"项目的源的目标实例。因为脚本在生成时生成的时无法执行"Build"的输出,并对不同的环境 (使用可能不同的架构) 执行多次。
在此的 GDR 过程中执行的操作生成并部署已更改为更好的支持方案我介绍了。在较高的级别在生成聚合项目的内容,并生成一组逻辑上表示部署包的文件。部署使用"部署软件包"文件生成一个的部署规划,然后通过生成 T-SQL 脚本中执行该计划。还可以配置部署到应用对目标数据库的脚本。在早期版本中, 同时生成和部署均可作为 MSBuild 任务,能团队的生成服务器上使用。
为支持多个环境中部署一个生成,部署面向配置信息被分解为不同的文件。尽管使用多个文件增加某些复杂性,但是它可以将其部署到源代码控制的不同环境时使用的配置。要使其具体,让我们来看看 图 7 ,我们要将我们的数据库项目的生成部署到四个不同的环境中所示的一个示例。
图 7 示例环境 |
环境 | 部署配置 |
开发 | 部署到此环境总是重新创建数据库。这是调试项目配置。自定义的 sqlcmd 变量。 |
集成 | 部署差分,在为项目中不存在的对象生成 ALTER 语句和垂直距离。这是发布项目配置。自定义的 sqlcmd 变量。 |
用户测试 | 产品部署的准备。部署差分。自定义的 sqlcmd 变量。 |
生产 | 部署差分。自定义的 sqlcmd 变量。 |
根据这些四个环境,我们可以定义四个自定义的部署配置文件和每个存储打算为目标的特定环境配置的 sqlcmd 文件。后设置这些文件,如 图 8 的项目的属性外观。
图 8 项目属性设置自定义部署
除了在的文件可以看到我设置调试项目配置默认的配置将 development.sqldeployment 文件。同样,development.sqlcmdvars 文件是默认定义 sqlcmd 变量和值。
已成功生成一个项目后,可用于生成输出部署到多个数据库实例。若要部署新的数据库或更新现有数据库有助于相同的生成输出。默认情况下部署在生成项目时,如前面所看到,将使用项目的配置 ; 但是,可以覆盖任何命令行上的属性.deploymanifest。是例如将部署到 图 8 中列出的所有环境中,,将使用以下命令行参数:
Development:
msbuild EnterpriseDB.dbproj /t:Deploy /p:DeploymentConfigurationFile=sql\debug\Development.sqldeployment /p:SqlCommandVariablesFile=sql\debug\Development.sqlcmdvars /p:TargetConnectionString= "DataSource=DEV\sql2008;Integrated Security=true;Pooling=false"
集成:
msbuild EnterpriseDB.dbproj /t:Deploy /p:DeploymentConfigurationFile=sql\debug\Integration.sqldeployment /p:SqlCommandVariablesFile=sql\debug\Integration.sqlcmdvars /p:TargetConnectionString= "DataSource=INT\sql2008;Integrated Security=true;Pooling=false"
用户测试:
msbuild EnterpriseDB.dbproj /t:Deploy /p:DeploymentConfigurationFile=sql\debug\UserTest.sqldeployment /p:SqlCommandVariablesFile=sql\debug\UserTest.sqlcmdvars /p:TargetConnectionString= "DataSource=USERTEST\sql2008;Integrated Security=true;Pooling=false"
产生式:
msbuild EnterpriseDB.dbproj /t:Deploy /p:DeploymentConfigurationFile=sql\debug\Production.sqldeployment /p:SqlCommandVariablesFile=sql\debug\Production.sqlcmdvars /p:TargetConnectionString= "DataSource=PRODUCTION\sql2008;Integrated Security=true;Pooling=false"
这些示例使用部署 MSBuild 任务将在 EnterpriseDB.dbproj 一个版本部署到多个环境使用不同的配置。 您可以执行相同类型的部署作为该种 GDR 调用 VSDBCmd 的一部分使用一种新的命令行工具,提供。
命令行设备,VSDBCmd
该 GDR 附带一个称为 VSDBCmd (vsdbcmd.exe) 的命令行工具。 此工具可以从现有数据库中创建.dbschema 文件,并将生成输出或仅.dbschema 文件部署到目标实例。 VSDBCmd 也可用于不安装 Visual Studio 的计算机上。 将命令行工具从一台计算机移动到另,将从 VSTSDB 目录下的部署目录复制该可执行文件及其组件。 在标准的 Visual Studio 安装,这将是"%programfiles%\microsoft Visual Studio 9.0\vstsdb\deploy\。 在部署目录可以复制到缩略图的驱动器,然后放置在另一台计算机上。
若要介绍 VSDBCmd,让我们从命令行运行工具。 图 9 显示结果。 虽然这些选项乍看可能显示复杂,但有要记住将帮助您了解这些选项的分组方式的几点:
- VSDBCmd 旨在用于多个数据库平台。 目前,VSTS 数据库 Edition 支持仅 SQL Server 但这可能在将来更改的版本。
- 要导入数据库架构或部署到数据库,必须提供连接字符串。 此连接字符串是数据库提供程序一个标准 ADO.NET 连接字符串。
- 独立于任何特定的数据库提供程序工具是您需要提供一个提示与考虑向其提供程序应使用该连接字符串和连接字符串必须定义要确定您的目标数据库版本。 对于是实例 SQL Server 部署的某些选项有只为 SQL 2005 及更高版本。
图 9 输出 VSDBCmd
>"%programfiles%\microsoft visual studio 9.0\vstsdb\deploy\vsdbcmd" /? Help for dynamic property usage /help[+|-] (short form /?) /Action:{Import|Deploy} (short form /a) /ConnectionString:<string> (short form /cs) /DatabaseSchemaProvider:<string> (short form /dsp) @<file> Read response file for more options Help for command actions /Action:{Import|Deploy} (short form /a) /Quiet[+|-] (short form /q) /ConnectionString:<string> (short form /cs) /DeployToDatabase[+|-] (short form /dd) /ModelFile:<string> (short form /model) /ManifestFile:<string> (short form /manifest) /DeploymentScriptFile:<string> (short form /script) /DatabaseSchemaProvider:<string> (short form /dsp) /Properties:<string> (short form /p) @<file> Read response file for more options
若要从 Northwind 数据库创建模型,我可以执行以下:
"%programfiles%\microsoft visual studio 9.0\vstsdb\deploy\vsdbcmd" /a:Import /cs:"Data Source=(local)\sql2008;Integrated Security=true;Initial Catalog=Northwind08" /dsp:sql /model:northwind.dbschema
此处我指示我要创建从连接字符串中指定的数据库中名为 Northwind.dbschema.dbschema 文件。 因为 VSDBCmd 支持多个提供程序,我还必须指定提供程序在这种情况下"SQL"提供程序创建该.dbschema 文件时使用。 您可以看到导入到模型的一个数据库选项是相当简单。 有 SQL Server 特有的一些其他导入选项。 若要查看这些选项,请可以使用以下动态属性帮助命令:
"%programfiles%\microsoft visual studio 9.0\vstsdb\deploy\vsdbcmd" /a:Import /cs:"Data Source=(local)\sql2008;Integrated Security=true" /dsp:sql /?
现在,我们可以围绕打开并部署我们导入到新数据库的模型。 要部署模型,使用下面的命令:
"%programfiles%\microsoft visual studio 9.0\vstsdb\deploy\vsdbcmd" /a:Deploy /cs:"Data Source=(local)\sql2008;Integrated Security=true" /model:northwind.dbschema /dd:+ /p:TargetDatabase=NewNorthwind
此命令可以部署包含 Northwind.dbschema 实例 (本地) \sql2008 并到名为 NewNorthwind 的新数据库的模型。 VSDBCmd 何时执行不部署到数据库选项 (/ dd: +),部署脚本生成,这是非常类似于部署项目或架构比较生成的脚本。 在前面的示例如果 (/ dd: +) 未指定,diff 脚本将输出 (因为我们没有指定一个名称,文件名称将是 Northwind.txt)。 这可以是生成验证脚本,并查看才能执行针对目标实例脚本一个好方法。
选项 /p:TargetDatabase = NewNorthwind 与不同于其他选项。 它是通过该工具可扩展性框架公开多个选项的示例。 若要查看可用于 SQL Server 的所有选项,请使用下面的命令,对 SQL Server 2008 数据库:
"%programfiles%\microsoft visual studio 9.0\vstsdb\deploy\vsdbcmd" /a:Deploy /cs:"Data Source=(local)\sql2008;Integrated Security=true" /dsp:sql /?
这些是不同的部署和架构比较配置页上可用的相同选项。
除了部署.dbschema 文件,VSDBCmd 还可使用和部署数据库项目生成的输出。 可以使用 VSDBCmd 执行相同的 multienvironment 使用 MSBuild 之前执行的部署。 但是,与 VSDBCmd,您不必使用.dbproj 文件来执行部署任务,或有 VSTS 数据库 Edition 安装。 在下面的示例中,VSDBCmd 生成输出目录中执行:
开发:
"%programfiles%\microsoft visual studio 9.0\vstsdb\deploy\vsdbcmd" /a:Deploy /manifest:EnterpriseDB.deploymanifest /p:DeploymentConfigurationFile=Development.sqldeployment /p:SqlCommandVariablesFile=Development.sqlcmdvars /cs:"Data Source=DEV\sql2008;Integrated Security=true"
集成:
"%programfiles%\microsoft visual studio 9.0\vstsdb\deploy\vsdbcmd" /a:Deploy /manifest:EnterpriseDB.deploymanifest /p:DeploymentConfigurationFile=Integration.sqldeployment /p:SqlCommandVariablesFile=Integration.sqlcmdvars /cs:"Data Source=INT\sql2008;Integrated Security=true"
用户测试:
"%programfiles%\microsoft visual studio 9.0\vstsdb\deploy\vsdbcmd" /a:Deploy /manifest:EnterpriseDB.deploymanifest /p:DeploymentConfigurationFile=UserTest.sqldeployment /p:SqlCommandVariablesFile=UserTest.sqlcmdvars /cs:"Data Source=USERTEST\sql2008;Integrated Security=true"
产生式:
"%programfiles%\microsoft visual studio 9.0\vstsdb\deploy\vsdbcmd" /a:Deploy /manifest:EnterpriseDB.deploymanifest /p:DeploymentConfigurationFile=Production.sqldeployment /p:SqlCommandVariablesFile=Production.sqlcmdvars /cs:"Data Source=PRODUCTION\sql2008;Integrated Security=true"
这些示例,您可以看到 VSDBCmd 可用于将数据库项目的生成部署到多个环境使用不同的配置。
SQL CLR 项目支持
因为 SQL Server 2005,开发人员必须能够实现类型、 过程、 函数和为 CLR 类型的触发器。在的 GDR 之前在使用为数据库项目的架构的一部分的这些类型难因为由 C# 或 Visual Basic 项目的程序集输出添加为 base 64 编码文本的脚本。与该的 GDR 支持的 SQL CLR 项目已大大增加。它们可以现在积极地用作您在设计时的数据库架构的一部分和管理实例上项目的部署过程中。让我们遍历检查它的工作原理的示例。
首先,创建解决方案,并添加 SQL Server 2008 数据库项目。接下来,添加 SQL CLR C# 项目命名为 CustomTypes, 图 10 所示。添加此 C# 项目时, 它提示您输入部署目标。因为程序集的部署是由数据库项目管理,取消此对话框。
图 10 中添加一个 SQL CLR 项目
现在将从数据库项目的引用添加到 C# 项目中。如 C# 项目的引用此引用将指示的由引用的项目使用引用的项目的内容。通过右键单击引用节点在数据库项目然后单击添加引用,请添加该引用。在在添加引用对话框选择 CustomTypes 项目。
虽然在添加该引用,但您仍需要自定义如何被配置正确部署的。若要修改程序集的配置,选择该引用,,然后按 F 4。图 11 显示了将在属性浏览器中看到。
图 11 CustomTypes 的设置属性
例如,我修改与项目的名称的 AssemblyName AssemblyOwner 明确地为 dbo。默认情况下, 程序集的权限级别是安全。但是,您可以更改此设置,如果您要将不安全代码部署到您的 SQL Server 实例。
到目前为止您可以部署程序集由 CustomTypes CLR 通过选择的项目部署 Database1 的项目属性。因为我们还没有配置为项目连接字符串,它将生成 CREATE 部署脚本。在输出窗口中您看到 图 12 所示的输出。
图 12 部署 CustomTypes 程序集
------ Build started: Project: CustomTypes, Configuration: Debug Any CPU ------ C:\WINDOWS\Microsoft.NET\Framework\v3.5\Csc.exe /noconfig /nowarn:1701,1702 /warn:4 /define:DEBUG;TRACE /reference:C:\WINDOWS\ Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\WINDOWS\ Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\WINDOWS\ Microsoft.NET\Framework\v2.0.50727\System.XML.dll /debug+ /debug:full /optimize- /out:obj\Debug\SqlClassLibrary.dll /target:library Properties\AssemblyInfo.cs Compile complete -- 0 errors, 0 warnings CustomTypes -> D:\Demos\Database1\CustomTypes\bin\Debug\SqlClassLibrary.dll ------ Build started: Project: Database1, Configuration: Debug Any CPU ------ Loading project references... Loading project files... Building the project model and resolving object interdependencies... Validating the project model... Writing model to Database1.dbschema... Database1 -> D:\Demos\Database1\Database1\sql\debug\Database1.dbschema ------ Deploy started: Project: CustomTypes, Configuration: Debug Any CPU ------ Error: Cannot deploy. There is no database connection specified. To correct this error, add a database connection using the project properties. Error: The operation could not be completed ------ Deploy started: Project: Database1, Configuration: Debug Any CPU ------ Deployment script generated to: D:\Demos\Database1\Database1\sql\debug\Database1.sql The deployment script was generated, but was not deployed. You can change the deploy action on the Deploy tab of the project properties. ========== Build: 2 succeeded or up-to-date, 0 failed, 0 skipped ========== ========== Deploy: 1 succeeded, 1 failed, 0 skipped ==========
CustomTypes 项目由 Database1,以便 Visual Studio 尝试部署 Database1 之前部署项目引用。 因为我们未提供为 CustomTypes 项目连接字符串,它可能不会部署,这将导致错误。 因为程序集将作为 Database1 部署脚本的一部分进行部署,我们可以忽略此错误。 您可以通过关闭部署 CustomTypes 通过配置管理器来防止此错误。
构建和部署项目之后, 您可以打开 Database1 部署脚本和看到程序集已经创建向该脚本的结尾处:
GO PRINT N'Creating CustomTypes...'; GO CREATE ASSEMBLY [CustomTypes] AUTHORIZATION [dbo] FROM 0x4D5A90000300000004[snip…] WITH PERMISSION_SET = SAFE; GO
程序集的内容还用于验证在生成时的类型引用。 若要查看此,请将用户定义类型 (UDT) 添加到使用默认模板 CustomTypes 项目中。 调用此文件 Type1.cs。 在数据库中,请使用此类型,它必须声明在数据库项目。 若要将用户定义的类型右键单击 Database1,单击添加项目,然后使用用户定义的类型 (CLR) 模板。 默认情况下, 由该模板创建该文件将如下:
CREATE TYPE [dbo].[Type1] EXTERNAL NAME [assembly_name].[type_name]
现在修改此 T-SQL CustomTypes 中的引用 Type 1 像下面这样:
CREATE TYPE [dbo].[Type1] EXTERNAL NAME [CustomTypes].[Type1]
保存此文件,然后查看错误列表。 您将看到如下所示的错误:
TSD04117: The referenced type with the required Clr attribute was not found in the loaded assembly.
此错误显示因为由于我们添加 Type1.cs 不已生成 CustomTypes 项目。 重建 CustomTypes 项目将会消失此错误。 可以使用此自定义的类型,作为列类型添加到项目的下表:
CREATE TABLE [dbo].[Table1] ( column_1 int NOT NULL, column_2 dbo.Type1 NULL )
在表添加到项目,dbo.Type1 对将由项目系统计算,并如果 dbo.Type1 不存在会导致错误。
除了编写部署脚本,项目也可以被部署到一个 SQL 2008 实例如 图 13 所示。 项目部署到目标实例时,部署引擎检测到数据库需要创建并在正确的相关性订单中创建该项目的内容。
图 13 部署 CustomTypes 项目
------ Build started: Project: CustomTypes, Configuration: Debug Any CPU ------ CustomTypes -> D:\Demos\Database1\CustomTypes\bin\Debug\SqlClassLibrary.dll ------ Build started: Project: Database1, Configuration: Debug Any CPU ------ Loading project references... Loading project files... Building the project model and resolving object interdependencies... Validating the project model... Writing model to Database1.dbschema... Database1 -> D:\Demos\Database1\Database1\sql\debug\Database1.dbschema ------ Skipped Deploy: Project: CustomTypes, Configuration: Debug Any CPU ------ Project not selected to build for this solution configuration ------ Deploy started: Project: Database1, Configuration: Debug Any CPU ------ Deployment script generated to: D:\Demos\Database1\Database1\sql\debug\Database1.sql Creating Database1... Creating CustomTypes... Creating dbo.Type1... Creating dbo.Table1... ========== Build: 2 succeeded or up-to-date, 0 failed, 0 skipped ========== ========== Deploy: 1 succeeded, 0 failed, 1 skipped ==========
静态代码分析改进
该 GDR 发布,静态代码分析是通过一个电源工具。该 GDR 已经集成静态代码分析,并提供几个使其执行更加灵活的静态代码分析 (SCA) 引擎更改。
现在可以作为每次生成的或从命令行使用 MSBuild 的一部分执行 SCA。若要强制运行每次生成的 SCA,切换启用代码分析代码分析项目的属性部分中的选项。每个规则或规则组可以被视为警告 (默认值) 或错误。在项目中查找错误的 SCA 规则可能会导致生成失败,并中止部署。禁止 SCA 警告和错误现在还显示在规则和文件级别。
要禁止规则,右键单击一个 SCA 警告或错误列表中的错误并选择取消静态代码分析的邮件。已取消的规则将添加到项目系统的根目录中称为 StaticCodeAnalysis.SupressMessages.xml 文件。若要将已取消的规则从项目中删除该文件,或从该文件中删除特定的规则和文件组合。图 14 显示了使用新的选项项目属性窗口在代码分析区域。
图 14 静态代码分析选项
SCA 可以启用作为数据库项目的生成的一部分。如果启用了 SCA 则它将作为每个项目生成的一部分将运行,并可能导致生成失败,如果通过 SCA 检测到错误。也是如此为启动从命令行使用 MSBuild 生成。该 GDR 还提供了一个 SCA MSBuild 目标 (StaticCodeAnalysis),这样 SCA 独立于生成选项启用 SCA 执行。
SCA 可以配置每个这意味着可以定义一组不同的规则和错误选项对于每个配置或环境的项目。从命令行运行 SCA 将生成名为 StaticCodeAnalysis.results.xml 结果文件。此文件写入到从其调用 MSBuild 目录中。结果文件名称,并且可通过重写 ResultsFile 属性中更改位置。
要从命令行使用 MSBuild 执行 SCA,使用下面的命令:
msbuild MyDatabase.dbproj /t:StaticCodeAnalysis
图 15 显示生成 SCA 结果文件的示例。
图 15 A 示例 SCA 结果文件
<?xml version="1.0" encoding="utf-8" ?> <Problems> <Problems> <Rule>Microsoft.Design#SR0001</Rule> <ProblemDescription>The shape of the result set produced by a SELECT * statement will change if the underlying table or view structure changes.</ProblemDescription> <SourceFile>C:\USERS\XXXX\DOCUMENTS\VISUAL STUDIO 2008\PROJECTS\ \ MYDATABASE\MYDATABASE\SCHEMA OBJECTS\SCHEMAS\DBO\PROGRAMMABILITY\STORED PROCEDURES\MYSTOREDPROC.PROC.SQL</SourceFile> <Line>6</Line> <Column>8</Column> <Severity>Warning</Severity> </Problems> </Problems>
Tips 和技巧
有多种随附在 GDR 需的前换行设置相应的便笺的其他更改。
使用此的 GDR 您拥有能够将对象从一个架构移动到另一个。此外,在 GDR 能够保留重构的更改,并发出可对目标服务器的这些更改部署过程中相应的 T-SQL。对于是实例如果重命名表,而不是删除和重新创建表下一个部署期间发出一个 sp_rename。
已扩展的可由数据库项目中引用的文件类型。在该的 GDR 引用可以创建以下文件类型:
- 项目
- .dbschema 文件
- .dll (SQL CLR 支持)
- .xsd (XSD)
数据库项目或对.dbschema 的文件引用的情况项目将以逻辑方式引用另一个数据库。如果该引用具有没有 part four-三个或名称,它被视为"复合"的项目引用。复合的项目是一种新的功能,允许将逻辑分割成多个项目的数据库,,目的是为了拆分数据库架构以及安全性或组织界限开发并手动部署以正确的顺序。复合的项目只支持不数据库到服务器或服务器到服务器的引用的数据库到数据库引用。在数据库到服务器的引用的情况下引用填充与文本"主"。
如前面所述文章,SQL CLR 项目、.dll 和.xsds 引用将了到数据库中包含引用的对象,以便通过您的源代码的其余部分使用的引用。这些引用的对象将部署作为数据库项目的部署的一部分。
在 GDR 版本中部署属性页已被改动以便轻松标志设置是否存储在项目文件 (.dbproj) 或用户设置文件 (.user)。图 16 显示了一个示例。
图 16 沙箱配置设置
使用此新的属性页中,您可以指定设置的存储位置。情况默认,连接字符串和部署配置的其余部分是存储在项目文件并团队成员之间共享。如果设置下拉列表更改为我的独立的开发环境中,该设置目标数据库设置将存储在.user 文件中。
数据库单元测试仅稍有修改为在 GDR 版本。更好支持在运行其中一个数据库项目部署每次测试测试驱动的开发,添加了一个更改。使用新的拆分之间生成和部署、 测试驱动开发之间命中因为数据库项目已实际部署每次运行测试的性能。(这不是以前的版本中的部署脚本会短路如果必须已被执行)。
由于大多数开发人员将为其单元测试运行使用沙箱数据库,并且只更新通过测试运行的沙箱,设置已添加,将执行数据库项目的部署,只有为项目.dbschema 是比.sql 脚本。若要以便此设置修改测试项目的 App.config,如下所示:
<DatabaseDeployment DatabaseProjectFileName="..\..\..\Database1\Database1.dbproj" Configuration="Debug" ForceDeployment="false"/>
检测到部署需要执行,并对其他计算机分开部署,部署脚本提供沙箱数据库的名称。 对于是实例沙箱数据库称为 Database1Sandbox,因此部署脚本名为 UnitTestDeployment_Database1Sandbox.sql。 如之前所述,此设置不应使用如果沙箱数据库架构修改任何方式而不通过单元测试执行。
可扩展性也已更新将会针对不同的数据库提供程序的扩展方法 GDR 中。 要作为针对特定提供商的扩展中定义一个类,您需要使用该 DatabaseSchemaProviderCompatibilityAttribute 修饰它。 针对所有的 SQL 版本在数据生成器的这将如下:
[DatabaseSchemaProviderCompatibility(typeof(SqlDatabaseSchemaProvider))]
单元测试不还,包含目标数据库提供程序的概念,并且所有这些现有的测试条件为独立的提供程序。 要定义新的测试条件中添加以下属性:
[DatabaseSchemaProviderCompatibility(DspCompatibilityCategory.Any)] [DatabaseSchemaProviderCompatibility(DspCompatibilityCategory.None)]
这些属性指示该测试条件是有效,没有数据库架构提供程序存在,并测试条件也是有效的所有数据库架构提供程序。
晓明 Laflen 是一个技术主管 DBPro 团队。 他负责测试数据生成和生成 / 部署功能的单位。 之前加入开发团队,晓明是 Microsoft 服务的一部分并帮助 Visual Studio 内的客户 implemement.NET 应用程序。
Barclay Hill 是程序管理器和 DBPro 团队的新成员。 Barclay 后多年导致大量的行业中的企业数据库应用程序开发工作提供给团队。