Adapting my previous “Script to examine SQL Server 2000 logins” for an upcoming SQL-2005 audit 🙂 …
-- sp_logins_report.sql
use dba
go
begin try drop table #rolemember, #dbnames, #report END TRY
BEGIN CATCH END CATCH -- ignore errors
--variables
declare @counter int
declare @dbname varchar(50)
declare @sqlstr nvarchar(4000)
--make table to hold database, user-define roles & user-names
create table #rolemember
(
rm_servername varchar(50) default @@servername,
rm_dbname varchar(1000),
rm_rolename varchar(1000),
rm_username varchar(1000),
rm_userid varchar(1000)
)
--make table to hold database names
create table #dbnames
(dbid int identity(1,1),
db_dbname varchar(50))
--make table to accumulate report
create table #report
(
re_servername varchar(50),
re_dbname varchar(1000),
re_rolename varchar(1000),
re_username varchar(1000),
re_userid varchar(1000)
)
--get members of each server role
insert into #rolemember (rm_rolename, rm_username, rm_userid)
exec dbo.sp_helpsrvrolemember
--get database names
insert into #dbnames (db_dbname)
select '[' + name + ']' from master.dbo.sysdatabases
where version > 0 -- online
set @counter = @@rowcount
--loop through databases to get members of database roles and user-defined roles
while @counter > 0
begin
--get database name from #dbnames table
set @dbname = (select db_dbname from #dbnames where dbid = @counter)
--get members of each database and user-defined role
set @sqlstr = 'insert into #rolemember (rm_rolename, rm_username, rm_userid)
exec ' + @dbname + '.dbo.sp_helprolemember'
exec sp_executesql @sqlstr
--update database name in rolemember table
update #rolemember
set rm_dbname = @dbname
where rm_dbname is null
set @counter = @counter - 1
end
--put data into report table
insert into #report
select rm.* from #rolemember rm
left join #report re
on rm.rm_username = re.re_username
and rm.rm_dbname = re.re_dbname
and rm.rm_rolename = re.re_rolename
and rm.rm_servername = re.re_servername
where re.re_servername is null
--display report
select re_username UserName, re_rolename RoleName, re_dbname DBName, re_servername ServerName
from #report
where re_username != 'dbo'
--order by re_username --display by user
order by re_rolename --display by role
--order by re_dbname --display by database