Eliminar un usuario sin dejar datos huérfanos en SQL Server
Elimina usuarios de SQL Server por completo, pero asegurándote de que no queden datos huérfanos en el proceso
Contexto
Eliminar un usuario de la sección de logins puede crear usuarios huérfanos en las bases de datos, por lo que se recomienda eliminar el acceso a la base de datos antes de eliminar el usuario.
Esto puede llevar bastante tiempo, así que con toda la información que he encontrado hemos creado el siguiente código.
Me ha ahorrado tiempo a la hora de eliminar usuarios, así que espero que pueda ayudarte.
SQL
DECLARE @UserName SysName='dfgsfdg'--Add Domain if Windows UserSET NOCOUNT ONCREATE TABLE #UserTable(UserName sysname,GroupName sysname,LoginName sysname NULL,DefDBName sysname NULL,DefSchemaName sysname NULL,UserID smallint,SID smallint)CREATE TABLE #Databases(DATABASE_NAME sysname,DATABASE_SIZE INT, REMARKS varchar(254))INSERT INTO #Databases EXEC sp_databasesDECLARE @DBName sysnameDECLARE c1 CURSOR FOR (SELECT DATABASE_NAME FROM #Databases)open c1fetch next from c1 into @DBNameWHILE @@FETCH_STATUS= 0BEGINPRINT @DBNameEXEC ('USE'+ @DBName +' INSERT INTO #UserTable EXEC sp_helpuser') IF (SELECT COUNT(*)FROM #UserTable WHERE UserName=@UserName)>0 BEGIN PRINT'Removing '''+@UserName +''' FROM '+@DBName EXEC ('USE '+ @DBName +' EXEC sp_dropuser '''+@UserName +'''') ENDDELETE FROM #UserTable--ClearTablefetch next from c1 into @DBNameENDCLOSE C1deallocate c1PRINT 'Revoking Login'IF CHARINDEX(@UserName,'\')>1 BEGINEXEC ('EXEC sp_revokelogin '''+ @UserName +'''')--Check string for domain info, assume windows if '/' foundENDIF CHARINDEX(@UserName,'\')=0 AND EXISTS(SELECT * FROM sys.server_principals WHERE name =@UserName) BEGIN--Check if SQL LoginEXEC ('DROP LOGIN ['+ @UserName +']')ENDDROP TABLE #UserTableDROP TABLE #Databases