@@ -30,6 +30,7 @@ ALTER PROCEDURE [dbo].[sp_DatabaseRestore]
3030 @SkipBackupsAlreadyInMsdb BIT = 0 ,
3131 @DatabaseOwner sysname = NULL ,
3232 @SetTrustworthyON BIT = 0 ,
33+ @FixOrphanUsers BIT = 0 ,
3334 @Execute CHAR (1 ) = Y,
3435 @FileExtensionDiff NVARCHAR (128 ) = NULL ,
3536 @Debug INT = 0 ,
@@ -1588,7 +1589,45 @@ IF @DatabaseOwner IS NOT NULL
15881589 END
15891590 END ;
15901591
1591- -- If test restore then blow the database away (be careful)
1592+ -- Link a user entry in the sys.database_principals system catalog view in the restored database to a SQL Server login of the same name
1593+ IF @FixOrphanUsers = 1
1594+ BEGIN
1595+ SET @sql = N'
1596+ -- Fixup Orphan Users by setting database user sid to match login sid
1597+ DECLARE @FixOrphansSql NVARCHAR(MAX);
1598+ DECLARE @OrphanUsers TABLE (SqlToExecute NVARCHAR(MAX));
1599+ USE ' + @RestoreDatabaseName + ' ;
1600+
1601+ INSERT @OrphanUsers
1602+ SELECT '' ALTER USER ['' + d.name + '' ] WITH LOGIN = ['' + d.name + '' ]; ''
1603+ FROM sys.database_principals d
1604+ INNER JOIN master.sys.server_principals s ON d.name COLLATE DATABASE_DEFAULT = s.name COLLATE DATABASE_DEFAULT
1605+ WHERE d.type_desc = '' SQL_USER''
1606+ AND d.name NOT IN ('' guest'' ,'' dbo'' )
1607+ AND d.sid <> s.sid
1608+ ORDER BY d.name;
1609+
1610+ SELECT @FixOrphansSql = (SELECT SqlToExecute AS [text()] FROM @OrphanUsers FOR XML PATH ('' '' ), TYPE).value('' text()[1]'' ,'' NVARCHAR(MAX)'' );
1611+
1612+ IF @FixOrphansSql IS NULL
1613+ PRINT '' No orphan users require a sid fixup.'' ;
1614+ ELSE
1615+ BEGIN
1616+ PRINT '' Fix Orphan Users: '' + @FixOrphansSql;
1617+ EXECUTE(@FixOrphansSql);
1618+ END;'
1619+
1620+ IF @Debug = 1 OR @Execute = ' N'
1621+ BEGIN
1622+ IF @sql IS NULL PRINT ' @sql is NULL for Fix Orphan Users' ;
1623+ PRINT @sql;
1624+ END ;
1625+
1626+ IF @Debug IN (0 , 1 ) AND @Execute = ' Y'
1627+ EXECUTE [dbo].[CommandExecute] @DatabaseContext = ' master' , @Command = @sql, @CommandType = ' UPDATE' , @Mode = 1 , @DatabaseName = @UnquotedRestoreDatabaseName, @LogToTable = ' Y' , @Execute = ' Y' ;
1628+ END ;
1629+
1630+ -- If test restore then blow the database away (be careful)
15921631IF @TestRestore = 1
15931632 BEGIN
15941633 SET @sql = N ' DROP DATABASE ' + @RestoreDatabaseName + NCHAR (13 );
0 commit comments