exec sp_RemoveUserScript 'username1'
exec sp_RemoveUserScript 'username2'
exec sp_RemoveUserScript 'username1'
exec sp_RemoveUserScript 'username2'
use master
go
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--*************************************************************************************************
--*************************************************************************************************
-- Generate a script to remove a user from a SQL Server instance.
-- The scripot will remove the user from all databases and remove the login from the SQL instance.
-- Any empty schemas owned by the user will be dropped, non-empty schemas will be changed to be
-- owned by 'dbo' using ALTER AUTHORIZATION
--*************************************************************************************************
--*************************************************************************************************
-- remove previous instance of this proc
if exists (select * from sysobjects where id = object_id('[dbo].[sp_RemoveUserScript]') and sysstat & 0xf = 4)
drop procedure [dbo].sp_RemoveUserScript
go
--*************************************************************************************************
-- Create the stored procedure
--
-- Inputs:
-- @name - login name (not database user name) that will be
--
-- Outputs:
-- List of commands to run are printed to the message out
--*************************************************************************************************
create proc sp_RemoveUserScript @name varchar(75)
as
begin
-- suppress count messages
set nocount on
-- variable to hold commands to be run
declare @cmd varchar(4000)
-- temp table to hold commands
if (select object_id('tempdb..##commands')) is not null
drop table ##commands
create table ##commands (command varchar(max))
-- create command to deal with schemas, generate either drop or alter auth statements
-- depending on whether or not the schema has any objects in it.
set @cmd = ';with sch as (
select
u.name as username,
s.name as schemaname,
sum(coalesce(cnt, 0)) as objectcount
from [?].sys.sysusers u
inner join [?].sys.schemas s
on s.principal_id = u.uid
left outer join (
select 1 as cnt, schema_id
from [?].sys.objects
) t on s.schema_id = t.schema_id
where u.name = '''+@name+'''
group by u.name, s.name
)
insert into ##commands
select
case when (objectcount>0) then ''use ?; ALTER AUTHORIZATION ON SCHEMA::[''+schemaname+''] TO dbo;''
else ''use ?; drop schema [''+schemaname+''];''
end
from sch'
-- execute schema search for all databases
exec dbo.sp_MSforeachdb @cmd
-- create command to generate drop user statements for all databases. uses SIDs to ensure
-- that all users connected to the login are removed.
set @cmd = 'insert into ##commands
select ''use ?; exec sp_dropuser [''+ d.name +'']; ''
from [?].dbo.sysusers d
inner join master.dbo.syslogins m
on d.sid = m.sid
where m.name = ''' + @name + ''''
-- execute the drop user generation commands
exec dbo.sp_MSforeachdb @cmd
-- add a final 'drop this login' command
insert into ##commands select 'use master; exec sp_droplogin [' + @name + '];' from master.sys.syslogins where name = '' + @name + ''
-- now that we have all the commands ready, generate output to message out. this does
-- require a cursor so that we can print the statements.
print ''
print ''
print ''
print '------------------ Clip Here ------------------'
print ''
declare cmdlist cursor for select command from ##commands
open cmdlist
fetch next from cmdlist into @cmd
while 0 = @@FETCH_STATUS
begin
print @cmd
fetch next from cmdlist into @cmd
end
-- clean up after ourselves
close cmdlist
deallocate cmdlist
drop table ##commands
end