首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >错误:迁移到Azure时的SQL71564

错误:迁移到Azure时的SQL71564
EN

Stack Overflow用户
提问于 2016-08-09 18:10:47
回答 1查看 15.4K关注 0票数 24

我正在尝试第一次迁移到Azure,并得到以下错误:

在用作数据包一部分的架构中找到一个或多个不受支持的元素。Error SQL71564:错误验证元素开发:元素开发已从其登录中孤立,无法部署。(Microsoft.SqlServer.Dac)

我有点困惑,因为'develop‘是我们一直用于测试的用户名,仅此而已。

背景:

  • 当前数据库正在SQL 2016 Express上运行。
  • 我正在使用2016 (刚刚下载以确保最新版本)进行迁移。
  • 该模式是使用来自C#类的实体框架/迁移创建的,因此没有我所能看到的异常情况。
  • 所有表都有主键。
  • 表之间不存在依赖关系(所有这些都是用代码完成的)
  • 我在这个DB上运行了SQLAzureMW (5.15.6),它没有发现任何错误(报告中的所有内容都是绿色的)。
EN

回答 1

Stack Overflow用户

发布于 2017-07-10 06:32:30

这种孤立情况的一个常见问题是数据库何时被还原。如果使用默认策略还原数据库,并且不执行restore命令以外的其他步骤,则还将还原在该还原数据库中创建的所有数据库用户。由于这些数据库用户没有登录或与SQL登录的连接已被切断,因此需要采取一些步骤来重新附加这些对象。

脚本

代码语言:javascript
运行
复制
SET NOCOUNT ON
USE {your-db-name}
GO
DECLARE @loop INT
DECLARE @USER sysname
DECLARE @sqlcmd NVARCHAR(500) = ''
 
IF OBJECT_ID('tempdb..#Orphaned') IS NOT NULL 
 BEGIN
  DROP TABLE #orphaned
 END
 
CREATE TABLE #Orphaned (UserName sysname,IDENT INT IDENTITY(1,1))
 
INSERT INTO #Orphaned (UserName)
SELECT [name] FROM sys.database_principals WHERE [type] IN ('U','S') AND is_fixed_role = 0 AND [Name] NOT IN ('dbo','guest','sys','INFORMATION_SCHEMA')
 
IF(SELECT COUNT(*) FROM #Orphaned) > 0
BEGIN
 SET @loop = 1
 WHILE @loop <= (SELECT MAX(IDENT) FROM #Orphaned)
  BEGIN
    SET @USER = (SELECT UserName FROM #Orphaned WHERE IDENT = @loop)
    IF(SELECT COUNT(*) FROM sys.server_principals WHERE [Name] = @USER) <= 0
     BEGIN
        IF EXISTS(SELECT 1 FROM sys.database_principals WHERE [Name] = @USER AND type_desc = 'WINDOWS_USER')
         BEGIN
            SET @sqlcmd = 'CREATE LOGIN [' + @USER + '] FROM WINDOWS'
            Exec(@sqlcmd)
            PRINT @sqlcmd
         END
        IF EXISTS(SELECT 1 FROM sys.database_principals WHERE [Name] = @USER AND type_desc = 'SQL_USER')
         BEGIN
            SET @sqlcmd = 'CREATE LOGIN [' + @USER + '] WITH PASSWORD = N''password'''
            Exec(@sqlcmd)
            PRINT @sqlcmd
         END
     END
     
    SET @sqlcmd = 'ALTER USER [' + @USER + '] WITH LOGIN = [' + @USER + ']'
    Exec(@sqlcmd)
    PRINT @USER + ' link to DB user reset';
    SET @loop = @loop + 1
  END
END
SET NOCOUNT OFF

在脚本中,我们将数据库用户映射到SQL登录,并将默认密码设置为“ password ”,这可能不起作用,这取决于Server上设置的密码策略。请根据您的服务器策略更改默认密码。

参考文献

http://blogs.lessthandot.com/index.php/DataMgmt/DBAdmin/fixing-orphaned-database-users/

票数 44
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38857692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档