3

我们正在测试从本地 SQL Server 2008R2 数据库到 Azure 的迁移,但遇到了困难。

过程遵循,基于 SO 文章:

  • 已安装 SQL Server 2012 客户端工具
  • 修改了数据库以删除指定填充因子的索引,以及无效的视图和过程(这是通过使用 SSMS 的导出数据层应用程序工具确定的,直到它成功创建 bacpac 文件)
  • 将成功创建的 bacpac 文件上传到 Azure
  • 通过使用导入方法创建新数据库的步骤
  • 从显示的 blob 存储状态中检索 bacpac 文件,但随后出现以下错误

BadRequest ;请求错误;错误状态码:</B> 'BadRequest'</P><P><B>详情:</B>服务操作过程中遇到错误。; 异常 Microsoft.SqlServer.Management.Dac.Services.ServiceException:无法验证请求;</P></DIV></BODY></html>

注意:上面的错误文本被修剪以排除 URL,因为我没有足够的分数。

我似乎找不到有关此错误的任何信息,也找不到任何其他日志详细信息来帮助确定它为什么不会导入。

由于错误提到无法进行身份验证,我们还尝试执行以下操作:

  • 在本地数据库上创建了新用户和密码
  • 使用相同的新用户和密码在 Azure 上定义新数据库

这没有任何区别。

如果有人能指出我们正确的方向来让这个工作正常进行,我们将不胜感激,因为我们需要多次复制这个过程。

谢谢。

4

2 回答 2

1

我们需要同样的东西。以下是我们执行的一些步骤和结果:

1) 使用 ghuey 创建的 SQL 数据库迁移工具导出您可以在此处下载:https ://sqlazuremw.codeplex.com/ 这是一个很棒的工具,我真的建议您先尝试一下。取决于数据库的复杂性,它可以正常工作。对我们来说,不幸的是没有工作。所以你进入了下一步。

2) DAC 包 2008 可以选择生成 DACPAC,女巫在 Azure 上创建数据库结构,然后您可以通过引用 2008 Studio Managament 中的连接来部署到 Azure,右键单击 Azure 服务器,部署 ... se更多细节在这里:http ://world.episerver.com/documentation/Items/Upgrading/EPiserver-Commerce/8/Migrating-Commerce-databases-to-Azure/ 好吧,如果这对你有用,试试这个。这更容易。对我们来说,不幸的是没有工作。所以你进入了下一步。

3)使用2012服务器导出bacpac,然后导入azure 这一步需要多个动作才能完成。这里是:

一个。生成2008的备份并将文件移动到2012服务器;

湾。将备份恢复到2012;

C。执行一些 SQL:

c1。将 SCHEMA 的所有所有者设置为 DBO。您可以使用 SQL 像这样移动架构:ALTER AUTHORIZATION ON SCHEMA::[db_datareader] TO [dbo]

c2。删除您创建的所有用户;

c3。删除所有列和表的所有 MS_Description(扩展属性)

c4。删除所有约束(提示:启用删除和创建选项生成数据库的完整脚本并复制“删除约束”部分

c5。我们需要删除数据库索引的填充因子选项。您可以重新创建索引(包括与聚集索引关联的 PK)。删除每个 PK Clustered 并不是那么容易,但在 Google 的帮助下,您将能够找到一个脚本来帮助您创建和删除。这是脚本:

    DECLARE @object_id int;
    DECLARE @parent_object_id int;
    DECLARE @TSQL NVARCHAR( 4000);
    DECLARE @COLUMN_NAME SYSNAME;
    DECLARE @is_descending_key bit;
    DECLARE @col1 BIT;
    DECLARE @action CHAR( 6);

    SET @action = 'DROP';
    --SET @action = 'CREATE';

    DECLARE PKcursor CURSOR FOR
    select kc.object_id , kc .parent_object_id
    from sys.key_constraints kc
    inner join sys .objects o
    on kc.parent_object_id = o.object_id
    where kc.type = 'PK' and o. type = 'U'
    and o.name not in ( 'dtproperties','sysdiagrams' )  -- not true user tables
    order by QUOTENAME (OBJECT_SCHEMA_NAME( kc.parent_object_id ))
            ,QUOTENAME( OBJECT_NAME(kc .parent_object_id));

    OPEN PKcursor ;
    FETCH NEXT FROM PKcursor INTO @object_id, @parent_object_id;

    WHILE @@FETCH_STATUS = 0
    BEGIN
    IF @action = 'DROP'
        SET @TSQL = 'ALTER TABLE '
                    + QUOTENAME (OBJECT_SCHEMA_NAME( @parent_object_id))
                    + '.' + QUOTENAME(OBJECT_NAME (@parent_object_id))
                    + ' DROP CONSTRAINT ' + QUOTENAME(OBJECT_NAME (@object_id))
    ELSE
        BEGIN
        SET @TSQL = 'ALTER TABLE '
                    + QUOTENAME (OBJECT_SCHEMA_NAME( @parent_object_id))
                    + '.' + QUOTENAME(OBJECT_NAME (@parent_object_id))
                    + ' ADD CONSTRAINT ' + QUOTENAME(OBJECT_NAME (@object_id))
                    + ' PRIMARY KEY'
                    + CASE INDEXPROPERTY( @parent_object_id
                                        ,OBJECT_NAME( @object_id),'IsClustered' )
                        WHEN 1 THEN ' CLUSTERED'
                        ELSE ' NONCLUSTERED'
                    END
                    + ' (' ;

        DECLARE ColumnCursor CURSOR FOR
            select COL_NAME (@parent_object_id, ic.column_id ), ic .is_descending_key
            from sys .indexes i
            inner join sys. index_columns ic
            on i .object_id = ic .object_id and i .index_id = ic .index_id
            where i .object_id = @parent_object_id
            and i .name = OBJECT_NAME (@object_id)
            order by ic. key_ordinal;

        OPEN ColumnCursor ;

        SET @col1 = 1 ;

        FETCH NEXT FROM ColumnCursor INTO @COLUMN_NAME, @is_descending_key;
        WHILE @@FETCH_STATUS = 0
        BEGIN
            IF (@col1 = 1 )
                SET @col1 = 0
            ELSE
                SET @TSQL = @TSQL + ',';

            SET @TSQL = @TSQL + QUOTENAME( @COLUMN_NAME)
                        + ' '
                        + CASE @is_descending_key
                            WHEN 0 THEN 'ASC'
                            ELSE 'DESC'
                        END;

            FETCH NEXT FROM ColumnCursor INTO @COLUMN_NAME, @is_descending_key;
        END;

        CLOSE ColumnCursor ;
        DEALLOCATE ColumnCursor ;

        SET @TSQL = @TSQL + ');';

        END;

    PRINT @TSQL;

    FETCH NEXT FROM PKcursor INTO @object_id , @parent_object_id ;
    END;

    CLOSE PKcursor ;
    DEALLOCATE PKcursor ;

c6. 重新创建 FK

c7. 删除所有索引

c8. 重新创建所有索引(没有填充因子选项)

d。现在,右键单击 2012 上的数据库并将数据层以 BACPAC 格式导出到 Azure 存储。完成后,在 Azure 上导入。它应该有效:-)

于 2015-04-02T07:55:42.940 回答
0

对于任何可能偶然发现此问题的人,我们已经能够通过使用 bacpac 文件通过 2012 客户端工具在本地 2008R2 服务器上创建一个新数据库来定位问题。

该错误与正在触发的删除触发器有关,我不明白为什么要执行它,但这是另一个问题。

希望这可以帮助其他人解决 SQL Azure 上的导入错误。

于 2013-12-04T02:41:12.093 回答