在开发过程中,经常需要将生产环境的数据刷新到开发环境中。本文将介绍一种解决方案,以实现这一需求。
要实现此解决方案,需要以下工具:
首先,需要映射所提供数据库的依赖关系。这将帮助创建一个数据加载包,通过先加载子表再加载父表来避免参照完整性问题。虽然在大型数据库中,这项任务可能会非常重复,但幸运的是,讨论的Membership数据库只包含11个表。
要找到对象的依赖关系,在SSMS中右键单击它(对象资源管理器 > 数据库 > 数据库 > 表 > 表),然后选择“查看依赖关系”。
在“对象依赖关系”窗口中,选择“所选对象依赖的对象”(对象依赖关系 > 常规)。这将显示所选对象的所有依赖项,按相反顺序排列。较低层次的项目需要在依赖表引用之前加载。
目标是为数据库创建一个依赖树。
无依赖关系:
有依赖关系:
从依赖树中,可以看到“Applications”需要首先加载,然后是“Users”、“Paths”和“Roles”,依此类推。有了这些信息,现在可以创建一个数据加载包。
将在BIDS中开发一个数据加载包,首先清除旧记录,然后从生产环境插入新记录。对于非常大的数据库,可以将脚本调整为只加载新记录并更新旧记录。然而,为了保持理智,将在同步新记录之前删除所有记录,因为Membership数据库通常尺寸较小。
首先,在BIDS中创建一个新的“Integration Services Project”(文件 > 新建项目 > 商业智能项目 > Visual Studio安装模板:Integration Services Project)。
通过在连接管理器窗口中右键单击并选择“新建OLE DB连接…”,添加两个OLE DB连接。一个用于源数据库,一个用于目标数据库。为每个数据库填写服务器名称和数据库名称。此外,将属性“DelayValidation”设置为True,以便稍后通过脚本动态连接字符串。
接下来,添加一个包含三个执行SQL任务的序列容器,并将它们按如下方式连接。由于在步骤1中确定了依赖关系,知道可以分三个阶段删除和加载数据(每个层次结构级别代表可以顺序执行的阶段)。
现在,添加SQL来删除从最依赖到最不依赖的表数据。在例子中,在第一阶段删除UsersInRole、Profile、Membership、PersonalizationPerUser和PersonalizationAllUsers。通过编辑执行SQL任务编辑器中的SQLStatement来实现。将连接设置为目标数据库,并为任务命名。为所有三个任务执行此操作,每个阶段只删除相应表的数据。
现在,准备开发包的数据加载部分。首先,添加另一个包含三个数据流任务的序列容器。这次,加载数据的顺序是相反的(从最不依赖到最依赖)。这意味着将首先加载Applications、SchemaVersions和WebEvent_Events。由于SchemaVersions和WebEvent_Events在任一方向上都没有依赖关系,将它们添加到这个阶段的例子中。
通过双击数据流任务打开加载Membership序列的第一阶段。从工具箱中,将一个OLE DB源和一个OLE DB目标添加到数据流中。开始配置源,通过双击它。从下拉菜单中选择源连接管理器,并将数据访问模式设置为“表或视图”。然后,选择想要加载的表。在这个例子中,从[dbo].[aspnet_Applications]开始。
接下来,将源和目标组件连接起来,双击目标进行配置。选择目标OLE DB连接管理器,将数据访问模式设置为“表或视图 - 快速加载”,然后点击确定。列映射应该已经正确设置(输入和输出列是相同的)。要检查,请打开OLE DB目标编辑器,然后点击映射页面。
继续为每个项目(SchemaVersions、WebEvent_Events)添加单独的源和目标组件。最终结果应该如下所示:
相应地为第二阶段和第三阶段添加其他源和目标组件。此时,可以测试新包。如果一切顺利,可以看到成功的输出和开发环境中的数据。
首先创建了数据库的依赖树,将数据加载过程分为三个阶段(每个阶段对应树层次结构的一个级别),并创建了一个可以作为计划任务或从命令行运行的数据加载包。在下一篇文章中,将探讨如何通过SSIS合并两个现有的Membership数据库,并将本地ASP.NETMembership数据库迁移到SQL Server。敬请关注更多更新。在评论中告诉想法!
dtexec /f "ASP.NET Membership Tools\bin\Refresh Membership.dtsx" /conn "Source"; "Data Source=source_server;Initial Catalog=source_database;Integrated Security=SSPI;" /conn "Target"; "Data Source=target_server;Initial Catalog=target_database;Integrated Security=SSPI;" /reporting W