Create the Procedure in master db or your tools database.
EXEC USP_EffectiveLoginPermissions '' go
CREATE PROCEDURE USP_EffectiveLoginPermissions @User VARCHAR(100) AS BEGIN SET NOCOUNT ON IF OBJECT_ID('tempdb..##ServerLogins') IS NOT NULL BEGIN DROP TABLE ##SERVERLOGINS END IF OBJECT_ID('tempdb..##DBUsers') IS NOT NULL BEGIN DROP TABLE ##DBUSERS END IF OBJECT_ID('tempdb..##DBList') IS NOT NULL BEGIN DROP TABLE ##DBLIST END IF OBJECT_ID('tempdb..##Results') IS NOT NULL BEGIN DROP TABLE ##RESULTS END DECLARE @DBName VARCHAR(128); DECLARE @SQLCmd VARCHAR(2000); DECLARE @NumberOfDBs INT; -- Get the SQL Server logins -- Create login table CREATE TABLE ##SERVERLOGINS ( [SID] VARBINARY(85) NULL, [LOGIN_NAME] VARCHAR(128) NULL); -- Populate login table INSERT INTO ##SERVERLOGINS SELECT SID,CAST(LOGINNAME AS VARCHAR(128)) AS [LOGIN_NAME] FROM MASTER.DBO.SYSLOGINS -- Create list of databases CREATE TABLE ##DBLIST ( [DBNAME] VARCHAR(128)) -- perform for all dbs on server INSERT INTO ##DBLIST SELECT [NAME] FROM MASTER..SYSDATABASES WHERE [DBID] > 4 ORDER BY [NAME]; SELECT @NumberOfDBs = COUNT(* ) FROM ##DBLIST -- Create the output table for the Database User ID's CREATE TABLE ##DBUSERS ( [DATABASE_USER_ID] VARCHAR(128), [SERVER_LOGIN] VARCHAR(128), [DATABASE_ROLE] VARCHAR(128), [DATABASE_NAME] VARCHAR(128)); -- Declare a cursor to loop through all the databases on the server DECLARE CSRDB CURSOR FOR SELECT [DBNAME] FROM ##DBLIST ORDER BY [DBNAME] -- Open the cursor and get the first database name OPEN CSRDB FETCH NEXT FROM CSRDB INTO @DBName -- Loop through the cursor WHILE @@FETCH_STATUS = 0 BEGIN -- populate ##DBUsers table for current db SELECT @SQLCmd = 'INSERT ##DBUsers ' + ' SELECT CAST(su.[name] AS VARCHAR(128)) AS [database_user_id], ' + ' CAST(COALESCE (u.[login_name], ''* Orphaned *'') AS VARCHAR(128))AS [server_login], ' + ' CAST(COALESCE (sug.name, ''Public'') AS VARCHAR(128)) AS [database_role],' + ' CAST(''' + @DBName + ''' AS VARCHAR(128)) AS [database_name]' + ' FROM [' + @DBName + '].[dbo].[sysusers] su' + ' LEFT OUTER JOIN ##ServerLogins u' + ' ON su.sid = u.sid' + ' LEFT OUTER JOIN ([' + @DBName + '].[dbo].[sysmembers] sm ' + ' INNER JOIN [' + @DBName + '].[dbo].[sysusers] sug ' + ' ON sm.groupuid = sug.uid)' + ' ON su.uid = sm.memberuid ' + ' WHERE su.hasdbaccess = 1' IF LTRIM(RTRIM(@User)) <> '' SELECT @SQLCmd = @SQLCmd + ' AND SU.name = ''' + @User + '''' -- uncomment to debug -- PRINT @SQLCmd EXEC(@SQLCmd) -- Get the next database name FETCH NEXT FROM CSRDB INTO @DBName -- End of the cursor loop END -- Close and deallocate the CURSOR CLOSE CSRDB DEALLOCATE CSRDB CREATE TABLE ##RESULTS ( [INSTANCE_NAME] VARCHAR(128), [DATABASE_NAME] VARCHAR(128), [OBJTYPE] VARCHAR(128), [LOGIN_STATUS] VARCHAR(128), [USERGRANTEE] VARCHAR(128)); TRUNCATE TABLE ##RESULTS --data for logins INSERT INTO ##RESULTS SELECT CAST(SERVERPROPERTY('ServerName') AS VARCHAR(50)) AS INSTANCE_NAME, DATABASE_NAME, MAX(CASE [DATABASE_ROLE] WHEN 'db_datareader' THEN 'db_datareader, ' ELSE '' END) + MAX(CASE [DATABASE_ROLE] WHEN 'db_accessadmin' THEN 'db_accessadmin, ' ELSE '' END) + MAX(CASE [DATABASE_ROLE] WHEN 'db_backupoperator' THEN 'db_backupoperator, ' ELSE '' END) + MAX(CASE [DATABASE_ROLE] WHEN 'db_datawriter' THEN 'db_datawriter, ' ELSE '' END) + MAX(CASE [DATABASE_ROLE] WHEN 'db_ddladmin' THEN 'db_ddladmin, ' ELSE '' END) + MAX(CASE [DATABASE_ROLE] WHEN 'db_denydatareader' THEN 'db_denydatareader, ' ELSE '' END) + MAX(CASE [DATABASE_ROLE] WHEN 'db_denydatawriter' THEN 'db_denydatawriter, ' ELSE '' END) + MAX(CASE [DATABASE_ROLE] WHEN 'db_owner' THEN 'db_owner, ' ELSE '' END) + MAX(CASE [DATABASE_ROLE] WHEN 'db_securityadmin' THEN 'db_securityadmin, ' ELSE '' END) + MAX(CASE [DATABASE_ROLE] WHEN 'public' THEN 'public, ' ELSE '' END) AS ROLE_OBJECTTYPE, CASE [SERVER_LOGIN] WHEN '* Orphaned *' THEN [SERVER_LOGIN] ELSE 'OK' END AS LOGIN_STATUS, CASE WHEN [DATABASE_USER_ID] = [SERVER_LOGIN] THEN [DATABASE_USER_ID] WHEN [SERVER_LOGIN] = '* Orphaned *' THEN [DATABASE_USER_ID] ELSE [DATABASE_USER_ID] + ' (' + [SERVER_LOGIN] + ')' END AS USER_GRANTEE FROM ##DBUSERS GROUP BY [DATABASE_NAME], [DATABASE_USER_ID], [SERVER_LOGIN] SELECT [INSTANCE_NAME], [DATABASE_NAME], [USERGRANTEE], LEFT(OBJTYPE,LEN([OBJTYPE])-1) AS ROLES, [LOGIN_STATUS] FROM ##RESULTS ORDER BY 1, 2, 3 END go
No comments:
Post a Comment