SQL 服务器复制数据库向导 -w/o- 登录提示错误 (SMO) 用户、组或角色 'x' 已存在于当前数据库中

SQL Server Copy database wizard -w/o- logins promts error (SMO) User, group, or role 'x' already exists in the current database

我想将数据库从服务器 a (2008) 复制到服务器 b (2012)。通常我只是做一个备份并在目标上恢复它。

拥有复制数据库向导功能将使我的任务变得更容易一些,因为我必须移动相当多的数据库。我正在使用 SMO 方法,我 运行 解决了几个我可以解决的问题,但现在我遇到了以下错误:

      Event Name: OnError
 Message: An error occurred while transferring data. See the inner exception for details.
StackTrace:    at Microsoft.SqlServer.Management.Smo.Transfer.TransferData()
   at Microsoft.SqlServer.Dts.Tasks.TransferObjectsTask.TransferObjectsTask.TransferDatabasesUsingSMOTransfer()
InnerException-->User, group, or role 'x' already exists in the current database.
StackTrace:    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at Microsoft.SqlServer.Management.Smo.Transfer.ExecuteStatements(SqlConnection destinationConnection, IEnumerable`1 statements, SqlTransaction transaction)
   at Microsoft.SqlServer.Management.Smo.Transfer.TransferData()
 Operator: CH\a
 Source Name: b
 Source ID: c
 Execution ID: d
 Start Time: 26.07.2091 11:30:57
 End Time: 26.07.2091 11:30:57
 Data Code: 0

在向导中,我选择不复制登录对象 或其他任何内容。所以根据我的理解,它应该做一个 "plain" 数据库副本,而不是别的。

如果您对出现此错误的原因有任何建议,我将不胜感激!

在 SQL 服务器上,登录与数据库用户不同。登录授予对服务器的访问权限,并且可以根据分配的权限访问多个数据库,而数据库用户只能被授予对其数据库中特定内容的访问权限。

除了设置transfer.CopyAlLogins = false;你还需要设置

transfer.CopyAllRoles = false;
transfer.CopyAllUsers = false;