【问题标题】:Error: SQL71564 When migrating to Azure错误:SQL71564 迁移到 Azure 时
【发布时间】:2016-12-15 21:50:37
【问题描述】:

我正在尝试第一次迁移到 Azure,但出现以下错误:

在用作部分的架构中发现一个或多个不受支持的元素 的一个数据包。错误 SQL71564:验证元素 [develop] 时出错: 元素 [develop] 已从其登录中孤立,不能 部署。 (Microsoft.SqlServer.Dac)

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

背景:

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

【问题讨论】:

  • 本地用户是否应该在迁移到 Azure 时出现问题,因为登录会根据 Azure 部署而改变?

标签: sql-server azure migration migrate


【解决方案1】:

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

脚本

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”,这取决于您的 SQL Server 上设置的密码策略,这可能不起作用。请根据您的服务器策略更改默认密码。

参考

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

【讨论】:

  • 感谢您的出色回答!它真的帮助了我! :)
  • @Nordis 很高兴听到!
  • 你不知道你为我节省了多少时间。谢谢@Mohit。
  • @Mahib 很高兴听到我可以帮助你。谢谢。
  • 你摇滚...帮了大忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多