--DB Refrehment: TAKING PROD DB BACKUPS & RESTORING IT IN TEST/DEV/PPE(STAGE) INSTANCE AS PER THE REQUEST.
--PART-1:
--1. @ PRODUCTION INSTANCE: TAKE COPY_ONLY BACKUP OF REQUIRED PROD DATABASE (EG: LithinDB_Prod)
--2. @ DEVELOPMENT/TEST: TAKE A BACKUP OF REQUIRED DEV/TEST DATABASE. (EG: LithinDB_Dev)
--3. @ DEV/TEST/STAGE OR PPE : TAKE SCRIPT BACKUP OF REQUIRED DB USERS. (EG: LithinDB_Dev) -- (EG: TAKE LithinDB_Dev DB USERS SCRIPT)
--(i) using object explorer --(ii)using copy database wizard.
DB REFRESHMENT (PROD TO DEV/TEST) BY PRAVEEN MADUPU (MB: +91-98661-30093)
DB REFRESHMENT (PROD TO DEV/TEST) BY PRAVEEN MADUPU (MB: +91-98661-30093)
--4. @ DEV/TEST/STAGE OR PPE: TAKE SCRIPT BACKUP OF DB USER ROLES OF LithinDB_Dev database. --(EG: TAKE LithinDB_Dev DB USER ROLES SCRIPT)
--TSQL Script to Generate Database Role Permissions
use dbname go select roles.name Role_Name, members.name Member_Name, 'exec sp_addrolemember ['+ roles.name+ '], ['+ members.name+ ']' Grant_Permission from sys.database_principals members inner join sys.database_role_members drm on members.principal_id = drm.member_principal_id inner join sys.database_principals roles on drm.role_principal_id = roles.principal_id where members.name <> 'dbo'
--Note: copy the output from the column 'Grant_Permission' and save it as 'DB User Role Permissions' Script.
--5. @ DEV/TEST: TAKE SCRIPT BACKUP OF OBJECT LEVEL PERMISSIONS in Dev datbase. (EG: LithinDB_Dev database) --(OBJECT LEVEL PERMISSIONS SCRIPT) --EG: SELECT, UPDATE, DELETE, DENY
--TSQL Script to Generate object level Permissions
SELECT CASE WHEN perm.state <> 'W' THEN perm.state_desc ELSE 'GRANT' END + SPACE(1) + perm.permission_name + SPACE(1) + 'ON ' + QUOTENAME(USER_NAME(obj.schema_id)) + '.' + QUOTENAME(obj.name) + CASE WHEN cl.column_id IS NULL THEN SPACE(0) ELSE '(' + QUOTENAME(cl.name) + ')' END + SPACE(1) + 'TO' + SPACE(1) + QUOTENAME(USER_NAME(usr.principal_id)) COLLATE database_default + CASE WHEN perm.state <> 'W' THEN SPACE(0) ELSE SPACE(1) + 'WITH GRANT OPTION' END AS '--Object Level Permissions' FROM sys.database_permissions AS perm INNER JOIN sys.objects AS obj ON perm.major_id = obj.[object_id] INNER JOIN sys.database_principals AS usr ON perm.grantee_principal_id = usr.principal_id LEFT JOIN sys.columns AS cl ON cl.column_id = perm.minor_id AND cl.[object_id] = perm.major_id ORDER BY perm.permission_name ASC, perm.state_desc ASC
--Note: Copy the output from the column 'Object Level Permissions' and save it as 'DB Object Level Permissions' Script.
DB REFRESHMENT (PROD TO DEV/TEST) BY PRAVEEN MADUPU (MB: +91-98661-30093)
DB REFRESHMENT (PROD TO DEV/TEST) BY PRAVEEN MADUPU (MB: +91-98661-30093)
--PART-2:
--1. Check for the Orphan Users in the restored db (eg: LithinDB_Dev ) using the below script.
--exec sp_change_users_login 'report'
--2. If any orphan users found, then drop them from the restored db (as these users belongs to prod db). --(EG: drop db users in LithinDB_Dev database) --Pl1, pl2,pl3,pl4,pl5 -- drop this db users in dev database (eg: LithinDB_Dev) as these are from prod db which are orphan db users.
--3. Now re-create the dev db(eg: LithinDB_Dev) users using the db users backup script taken in PART-1 (STEP-3).
--4. now fix the orphan users using the following script:
--TSQL Script to fix the orphan users manually one by one as follows: --exec sp_change_users_login 'auto_fix','DL1' --exec sp_change_users_login 'auto_fix','DL2' --exec sp_change_users_login 'auto_fix','DL3' --exec sp_change_users_login 'auto_fix','DL4' --exec sp_change_users_login 'auto_fix','DL5'
or
--TSQL Script used to fix orphan users automatically
use LithinDB_Dev -- give your dev/test/stage db name here go DECLARE @username varchar(25) DECLARE fixusers CURSOR FOR SELECT UserName = name FROM sysusers WHERE issqluser = 1 and (sid is not null and sid <> 0x0) and suser_sname(sid) is null ORDER BY name OPEN fixusers FETCH NEXT FROM fixusers INTO @username WHILE @@FETCH_STATUS = 0 BEGIN EXEC sp_change_users_login 'update_one', @username, @username FETCH NEXT FROM fixusers INTO @username END CLOSE fixusers DEALLOCATE fixusers
--5. Again check for any Orphan Users in the restored db (eg: LithinDB_Dev ) using the below script.
--exec sp_change_users_login 'report' -- if any orphan user still exists, then check whether the corresponding login (windows/SQL) exists under SQL Server Security folder. -- if the login does not exist, then drop the orphan user(which is prod db user) from the current restored database.
DB REFRESHMENT (PROD TO DEV/TEST) BY PRAVEEN MADUPU (MB: +91-98661-30093)
DB REFRESHMENT (PROD TO DEV/TEST) BY PRAVEEN MADUPU (MB: +91-98661-30093)
--6. Now re-create the dev/test/ db user roles using the SCRIPT BACKUP OF DB USER ROLES taken using PART-1 (STEP-4).
--7. Now re-create the dev/test db object level permission using the Script Backup of Object level permissions from PART-1 (STEP-5).