Search

Saturday, 15 September 2018

Database Users and Logins after Restoring Back up from different SQL SERVER instance

I came across this after migrating some databases from Test Environment to Production that there are orphan accounts when restored Database to Production and some are missing ties between users and logins .So in short if you run the below store procedure in context of your database it will take care of your users and logins


---SCRIPT ALL USERS AND PASSWORDS 
SELECT 'IF(SUSER_ID('+QUOTENAME(SP.name,'''')+') IS NULL)BEGIN CREATE LOGIN '+QUOTENAME(SP.name)+CASE WHEN SP.type_desc = 'SQL_LOGIN'THEN ' WITH PASSWORD = '+CONVERT(NVARCHAR(MAX),SL.password_hash,1)+' HASHED'ELSE ' FROM WINDOWS'END + ';/*'+SP.type_desc+'*/ END;'COLLATE SQL_Latin1_General_CP1_CI_ASFROM sys.server_principals AS SPLEFT JOIN sys.sql_logins AS SLON SP.principal_id = SL.principal_id
WHERE SP.type_desc IN ('SQL_LOGIN','WINDOWS_GROUP','WINDOWS_LOGIN')AND SP.name NOT LIKE '##%##'AND SP.name NOT IN ('SA');
  
--TIE USERS SPIDS TO AVOID ORPHANED ACCOUNTS

EXEC sp_MSForEachDb '
USE [@DataBaseName]

DECLARE @cmd VARCHAR(1000)

DECLARE @users TABLE (Name VARCHAR(100), sid UNIQUEIDENTIFIER)

DECLARE @logins TABLE (Name VARCHAR(100), sid UNIQUEIDENTIFIER)

DECLARE @cmd VARCHAR(1000)
DECLARE @users TABLE (Name VARCHAR(100), sid UNIQUEIDENTIFIER)
DECLARE @logins TABLE (Name VARCHAR(100), sid UNIQUEIDENTIFIER)
INSERT INTO @users SELECT name, sid FROM sysusers
INSERT INTO @logins SELECT name, sid FROM master.dbo.syslogins SELECT @cmd = COALESCE(
@cmd + CHAR(10) + ''EXEC sp_change_users_login ''''UPDATE_ONE'''', '''''' + u.name + '''''', '''''' + u.name + '''''''',
''USE '' + DB_NAME() + CHAR(10) + ''EXEC sp_change_users_login ''''UPDATE_ONE'''', '''''' + u.name + '''''', '''''' + u.name + ''''''''
)
FROM @users u JOIN @logins l

ON u.name = l.name AND u.sid <> l.sid

IF ISNULL(@cmd, '''') <> '''' BEGIN

PRINT @cmd

EXEC(@cmd)

END ELSE BEGIN

PRINT ''-- '' + ''?'' + '' All users resolved''

END

IF ISNULL(@cmd, '''') <> '''' BEGIN
PRINT @cmd
EXEC(@cmd)
END ELSE BEGIN
PRINT ''-- '' + ''?'' + '' All users resolved''
END
'





No comments:

Post a Comment