我在项目中使用Azure SQL DB和Federations,并希望将sql脚本保留在解决方案中。在我尝试使用federation关键字编辑sql代码之前,它从未引起过任何问题。我发现无法将db项目与azure联合集成。这是一个问题。 我只想在我的解决方案中保留db模式但是正确,而不仅仅包含txt文件。
有什么想法?
答案 0 :(得分:2)
有超过一年的博客文章http://blogs.msdn.com/b/ssdt/archive/2012/01/06/ssdt-does-not-support-sql-azure-federations.aspx谈论不支持联盟的SQL Server数据工具,如果这就是你所追求的。
不完全回答您的问题,但我最终在VS 2012中创建了SQL Server数据库项目,例如
联合表位于Database.Federated项目中,每个表都有自己的.table.sql文件,但我没有将FEDERATED ON(cid = CustomerId)放在该文件中。
相反,我有另一个单独的SQL文件(CreateFederatedTables.sql),其中所有表都使用FEDERATED ON(cid = CustomerId),我在Sql Azure上手动运行CreateFederatedTables.sql,我仍然可以使用“发布”选项发布到本地sql进行测试。
我已禁用“Extended Transact-SQL Verification”,因此编译器不会抱怨。
有一些重复,但想不出另一种方法来处理它。
答案 1 :(得分:1)
想要提供另一种方法。正如pateketu指出的那样,SSDT目前不支持这一点,但我仍然发现SSDT在联合环境中非常有用,非常值得在VS中创建和维护数据库项目。
首先,我为根数据库和每个联盟维护单独的数据库项目。根数据库的项目当然与您使用过的任何其他项目一样,因此无需任何解释。
每个联合项目都包含联合中所需的所有联合表,引用表,存储过程和其他对象。需要记住的重要部分是所有联合表需要首先在联合中手动创建,而不是从SSDT发布(当然这是无法完成的)。只需复制和粘贴每个表脚本以及FEDERATED ON子句,就可以非常轻松地完成此操作。 (您可以在运行脚本之前添加该子句,或者我只是继续将它们包含在SSDT的脚本中 - 它不会抱怨或删除它们,如果您尝试发布它就会将它们删除。)
创建联合表后,可以与所有其他对象类型一起维护(更改)它们,并且可以通过直接连接到每个联合成员数据库来比较和发布更改。数据库具有随机名称,但Azure门户应该有助于确定哪些数据库属于哪个联合。
在开发期间,这一切都非常易于管理,因为我通常每个联合会只有一个成员,当然除了在应用程序中测试联合逻辑和进行性能测试之外。但通常在测试联合会之后,我会退回到一个成员。
一旦您在生产环境中工作,它仍然非常有用。模式是否与任何一个联合成员的目标进行比较。只需生成发布脚本,而不是发布它。去除顶部的所有SQLCMD内容(可能是所有内容,包括USE [$(DatabaseName)]命令),将FEDERATED ON子句添加到联合表的任何CREATE TABLE命令(只有在您已添加联合表),并且您拥有基本的架构更新脚本。然后,您可以为每个成员复制并粘贴该脚本的全部内容,每个副本前面都有适用于该成员的USE FEDERATION命令。现在您有一个可以针对生产数据库运行的脚本。 (希望您有一个独立的开发数据库,它反映了生产数据库的模式,您可以一如既往地对其进行测试。)这将在相当短的时间内更新所有成员的模式,具体取决于成员数量和你的变化多么极端。与用于生产中的联合模式更改的任何其他方法一样,无法保证在一段时间内事物不会不同步,从而导致错误。您的应用程序应始终包含重试逻辑。
显然,这并不像SSDT支持联盟那样顺利。我试图为可能遇到的其他任何人做的一点是,即使使用联合,SSDT在模式开发和生成更新脚本方面仍然有很多东西,与尝试创建的替代方案相比并手动维护架构更新脚本。
(我应该注意到我正在使用VS 2013附带的SSDT,我无法验证我所说的所有内容都适用于VS 2012的SSDT。)