A login cannot be dropped while it is logged in. A login that owns any securable, server-level object, or SQL Server Agent job cannot be dropped.
This code can be used to drop Login from SQL Server and user name associated with this Login in different databases.
1
2------------------------------------
3-- Drop user - SQL Script --
4------------------------------------
5--
6-- Login name to delete
7DECLARE @userToDelete nvarchar(200) = 'TestLogin';
8--
9--
10IF (NOT EXISTS (SELECT * FROM sys.syslogins AS L WHERE L.loginname = @userToDelete))
11BEGIN
12 RAISERROR('
13 Login not found.
14 ', 50000, 0) WITH log
15END
16
17DECLARE @sql nvarchar(max);
18
19PRINT '-- CHECK Databases'
20USE [master];
21SET @sql = '';
22select @sql=@sql+'USE ['+d.name+']; EXEC dbo.sp_changedbowner @loginame = N''sa'', @map = false;'+CHAR(13) from sys.sysdatabases d left join master.sys.syslogins l on d.sid = l.sid WHERE l.name = 'TestLogin';
23PRINT @sql;
24EXEC (@sql);
25
26PRINT '-- CHECK Jobs'
27USE [master];
28SET @sql = '';
29select @sql=@sql+'EXEC msdb.dbo.sp_update_job @job_name=N'''+s.name+''', @owner_login_name=N''sa'';'+CHAR(13) from msdb..sysjobs s left join master.sys.syslogins l on s.owner_sid = l.sid WHERE l.name = @userToDelete
30PRINT @sql;
31EXEC (@sql);
32
33PRINT '-- CHECK Schemas'
34SET @sql = '
35DECLARE @sql nvarchar(max);
36SET @sql = '''';
37SELECT @sql=@sql+''ALTER AUTHORIZATION ON SCHEMA::['' + s.name + ''] TO [dbo];''+CHAR(13) FROM [?].sys.schemas AS s INNER JOIN [?].sys.sysusers AS u ON s.principal_id = u.uid WHERE (u.name = '''+@userToDelete+''')
38IF NOT (@sql='''')
39BEGIN
40 SET @sql = ''USE [?]''+CHAR(13)+@sql+''DROP USER ['+@userToDelete+']''+CHAR(13);
41 PRINT @sql;
42 EXEC (@sql);
43END
44'
45exec sp_MSforeachdb @sql;
46
47PRINT '-- CHECK Connections'
48USE [master];
49SET @sql = '';
50select @sql = @sql + 'KILL ' + cast(spid AS NVARCHAR(10)) + ';'+ char(13) FROM master..sysprocesses Where loginame = @userToDelete;
51PRINT @sql;
52EXEC (@sql);
53
54PRINT '-- DROP Login'
55SET @sql = 'DROP LOGIN ['+@userToDelete+']'+CHAR(13);
56PRINT @sql;
57EXEC (@sql);
58
59GO
source: https://msdn.microsoft.com/en-us/library/ms188012.aspx
Comments