|
|
|
Forum Newbie
      
Group: General Forum Members
Last Login: Thursday, November 04, 2010 11:15 AM
Points: 3,
Visits: 32
|
|
Nice... works great.
Thanks, -Adam
|
|
|
|
|
SSC Eights!
      
Group: General Forum Members
Last Login: Thursday, December 06, 2012 8:30 AM
Points: 879,
Visits: 810
|
|
It might be a great script, but I still have the errors mentioned in the first posting; I thought it was rectified. I cannot find an easy way to remove these 'illegal' characters, hence I cannot test it. Pity
Greetz, Hans Brouwer
|
|
|
|
|
SSC-Enthusiastic
      
Group: General Forum Members
Last Login: Friday, July 13, 2012 9:19 AM
Points: 140,
Visits: 316
|
|
|
|
|
|
Grasshopper
      
Group: General Forum Members
Last Login: Tuesday, February 16, 2010 3:40 AM
Points: 12,
Visits: 14
|
|
Hiya,
I've been playing around with this today as I have SQL2000 and I have made it work using the following attached code
Kind regards
Jo Wright
|
|
|
|
|
SSC Eights!
      
Group: General Forum Members
Last Login: Today @ 6:27 AM
Points: 985,
Visits: 827
|
|
Had a play around as well, and this runs on a Central Management Server across multiple SQL boxes with multiple builds (2000, 2005 & 2008).
USE MASTER GO
BEGIN
IF LEFT(CAST(Serverproperty('ProductVersion') AS VARCHAR(1)),1) = '8' begin IF EXISTS (SELECT TOP 1 * FROM Tempdb.dbo.sysobjects (nolock) WHERE name LIKE '#TUser%') begin DROP TABLE #TUser end end ELSE begin IF EXISTS (SELECT TOP 1 * FROM Tempdb.sys.objects (nolock) WHERE name LIKE '#TUser%') begin DROP TABLE #TUser end end
CREATE TABLE #Tuser ( DBName SYSNAME, [Name] SYSNAME, GroupName SYSNAME NULL, LoginName SYSNAME NULL, default_database_name SYSNAME NULL, default_schema_name VARCHAR(256) NULL, Principal_id INT)
IF LEFT(CAST(Serverproperty('ProductVersion') AS VARCHAR(1)),1) = '8' INSERT INTO #TUser EXEC sp_MSForEachdb ' SELECT ''?'' as DBName, u.name As UserName, CASE WHEN (r.uid IS NULL) THEN ''public'' ELSE r.name END AS GroupName, l.name AS LoginName, NULL AS Default_db_Name, NULL as default_Schema_name, u.uid FROM [?].dbo.sysUsers u LEFT JOIN ([?].dbo.sysMembers m JOIN [?].dbo.sysUsers r ON m.groupuid = r.uid) ON m.memberuid = u.uid LEFT JOIN dbo.sysLogins l ON u.sid = l.sid WHERE (u.islogin = 1 OR u.isntname = 1 OR u.isntgroup = 1) and u.name not in (''public'',''dbo'',''guest'',''sys'') ORDER BY u.name ' ELSE INSERT INTO #TUser EXEC sp_MSForEachdb ' SELECT ''?'', u.name, CASE WHEN (r.principal_id IS NULL) THEN ''public'' ELSE r.name END GroupName, l.name LoginName, l.default_database_name, u.default_schema_name, u.principal_id FROM [?].sys.database_principals u LEFT JOIN ([?].sys.database_role_members m JOIN [?].sys.database_principals r ON m.role_principal_id = r.principal_id) ON m.member_principal_id = u.principal_id LEFT JOIN [?].sys.server_principals l ON u.sid = l.sid WHERE u.TYPE <> ''R'' and u.name not in (''public'',''dbo'',''guest'',''sys'') order by u.name '
SELECT * FROM #TUser ORDER BY DBName, [name], GroupName
DROP TABLE #TUser END
|
|
|
|
|
Forum Newbie
      
Group: General Forum Members
Last Login: Wednesday, February 13, 2013 6:09 AM
Points: 2,
Visits: 193
|
|
--minor changes so it works on a case-sensitive server USE master GO
BEGIN
IF LEFT(CAST(Serverproperty('ProductVersion') AS VARCHAR(1)),1) = '8' begin IF EXISTS (SELECT TOP 1 * FROM tempdb.dbo.sysobjects (nolock) WHERE name LIKE '#TUser%') begin DROP TABLE #TUser end end ELSE begin IF EXISTS (SELECT TOP 1 * FROM tempdb.sys.objects (nolock) WHERE name LIKE '#TUser%') begin DROP TABLE #TUser end end
CREATE TABLE #TUser ( DBName SYSNAME, [Name] SYSNAME, GroupName SYSNAME NULL, LoginName SYSNAME NULL, default_database_name SYSNAME NULL, default_schema_name VARCHAR(256) NULL, Principal_id INT)
IF LEFT(CAST(Serverproperty('ProductVersion') AS VARCHAR(1)),1) = '8' INSERT INTO #TUser EXEC sp_MSforeachdb ' SELECT ''?'' as DBName, u.name As UserName, CASE WHEN (r.uid IS NULL) THEN ''public'' ELSE r.name END AS GroupName, l.name AS LoginName, NULL AS Default_db_Name, NULL as default_Schema_name, u.uid FROM [?].dbo.sysUsers u LEFT JOIN ([?].dbo.sysMembers m JOIN [?].dbo.sysUsers r ON m.groupuid = r.uid) ON m.memberuid = u.uid LEFT JOIN dbo.sysLogins l ON u.sid = l.sid WHERE (u.islogin = 1 OR u.isntname = 1 OR u.isntgroup = 1) and u.name not in (''public'',''dbo'',''guest'',''sys'') ORDER BY u.name ' ELSE INSERT INTO #TUser EXEC sp_MSforeachdb ' SELECT ''?'', u.name, CASE WHEN (r.principal_id IS NULL) THEN ''public'' ELSE r.name END GroupName, l.name LoginName, l.default_database_name, u.default_schema_name, u.principal_id FROM [?].sys.database_principals u LEFT JOIN ([?].sys.database_role_members m JOIN [?].sys.database_principals r ON m.role_principal_id = r.principal_id) ON m.member_principal_id = u.principal_id LEFT JOIN [?].sys.server_principals l ON u.sid = l.sid WHERE u.TYPE <> ''R'' and u.name not in (''public'',''dbo'',''guest'',''sys'') order by u.name '
SELECT * FROM #TUser ORDER BY DBName, [Name], GroupName
DROP TABLE #TUser END
|
|
|
|
|
Forum Newbie
      
Group: General Forum Members
Last Login: Monday, June 10, 2013 9:15 AM
Points: 8,
Visits: 233
|
|
Great script. 2 things. 1. Proper version handling. The version expresssion should be handled as this:
CAST((LEFT(CAST(Serverproperty('ProductVersion') AS VARCHAR(2)), 2)) AS INT)
Then it will work for SQL 2008 and up
2. Database names should be bracketed "[" and "]" to handle spaces and dashes in the database names.
But the idea is awesome. It gives plenty of login/user/role info that is difficult to collect othewise. Good idea for a report too. Thanks Alex Donskoy SQL Server DBA Greenberg & Trauriq PA, Miami FL
|
|
|
|