Skip to content

Commit e1e0706

Browse files
authored
Merge pull request #3270 from sqlslinger/AddFixOrphanUsersOption
sp_DatabaseRestore: Add @FixOrphanUsers option
2 parents 1d31d5a + 72d9609 commit e1e0706

1 file changed

Lines changed: 40 additions & 1 deletion

File tree

sp_DatabaseRestore.sql

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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)
15921631
IF @TestRestore = 1
15931632
BEGIN
15941633
SET @sql = N'DROP DATABASE ' + @RestoreDatabaseName + NCHAR(13);

0 commit comments

Comments
 (0)