通过bacpac导入创建Azure SQL数据库失败



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

流程遵循,基于SO文章:

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

BadRequest;请求错误;错误状态代码:<B>';BadRequest'<P>lt;P>lt;B>详细信息:<B>服务操作过程中遇到错误;例外Microsoft.SqlServer.Management.Dac.Services.ServiceException:无法认证请求<P>lt/DIV>lt/身体>lt/html>

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

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

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

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

这没有任何区别。

如果有人能为我们指明正确的方向,我们将不胜感激,因为我们需要多次复制这个过程。

谢谢。

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

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

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

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

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

b。将备份恢复到2012年;

c。做一些SQL:

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

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

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

c4.删除所有约束(提示:在启用了删除和创建选项的情况下生成数据库的完整脚本,并复制"删除约束"的部分

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

    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.重新创建FKs

c7.删除所有索引

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

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

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

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

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

最新更新