13

我真的在为管理基于 Visual Studio 2010 数据库项目的 SQL Azure 数据库的最佳方法而苦苦挣扎。我认为使用 VSDBCMD 创建用于升级的差异脚本然后在 SSMS 中简单地针对 SQL Azure 运行会很容易。但是,我得到了可怕的“无法确定目标数据库模式提供程序。部署无法继续。” 错误。

在这一点上,我只是假设 SQL Azure 不支持 VSDBCMD 中的某些东西,反之亦然,我正在研究其他方法。这是我目前正在考虑的方法:

  1. 使用 Azure 数据库引擎设置从 SSMS 编写我的 SQL Azure 数据库脚本。
  2. 从步骤 1 中的脚本创建临时本地数据库。
  3. 从步骤 2 开始,使用 VSDBCMD 针对本地数据库创建我的增量脚本。
  4. 查看/修改步骤 3 中的脚本。
  5. 在 SSMS 中针对 SQL Azure 运行步骤 3/4 中的脚本。

好坏?还有其他想法吗?

编辑:我今天更新到 Visual Studio 2010 SP1,发现 Microsoft.Data.Schema.Sql.dll 中有一个新的数据库架构提供程序:SqlAzureDatabaseSchemaProvider。但是,我无法确定如何实际使用这个坏男孩。现在,当我对 Azure 数据库尝试相同的 VSDBCMD 脚本时,我得到:

无法将源数据库架构提供程序 Sql100DatabaseSchemaProvider 转换为提供程序 SqlAzureDatabaseSchemaProvider。部署无法继续。

我还尝试使用具有相同结果的 Sql90 提供程序。我什至手动编辑了 dbproj 文件并将 DSP 属性更改为 SqlAzureDatabaseSchemaProvider。当我重新加载项目时,我得到:

数据库模式提供者必须提供 DataGenerationServices 的实现。

有没有人用 VS 2010 SP1 试过这个?

4

3 回答 3

3

您可以使用SQL Azure 迁移向导并使用它。也许您可以获取脚本并根据需要对其进行编辑。只是一个想法。

于 2011-03-24T09:21:54.713 回答
1

查看数据库项目的属性页面。它应该显示一个下拉列表,其中包含项目的各种可用提供程序。如果您选择 Azure 提供程序,您应该能够将该项目部署为您的 Azure 应用程序的一部分。

于 2011-03-24T15:35:03.357 回答
1

只需一个简单的命令行工具即可替换无效的 SQL Azure 语句:

    private const string STARTPLACEHOLDER = "AZURESCRIPTSTARTPLACEHOLDER";

    public static void Do(string fileName)
    {
        // Read the original file
        StringBuilder script = new StringBuilder();
        using (StreamReader reader = new StreamReader(fileName))
        {
            script.Append(reader.ReadToEnd());
        }

        // Remove everything before the start placeholder
        int startPlaceHolder = script.ToString().IndexOf(STARTPLACEHOLDER, 0);
        if (startPlaceHolder > 0)
        {
            script.Remove(0, startPlaceHolder + STARTPLACEHOLDER.Length);
        }

        // Remove WITH clause
        script.Replace("WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF)", string.Empty);

        // Create azure compatible output file
        using (StreamWriter writer = new StreamWriter(Path.Combine(Path.GetDirectoryName(fileName), Path.GetFileNameWithoutExtension(fileName) + "_Azure" + Path.GetExtension(fileName))))
        {
            writer.Write(script.ToString());
        }
    }
于 2011-05-05T04:30:49.007 回答