CREATE TABLE [dbo].[groups]( [GroupID] [int] IDENTITY(1,1) NOT NULL, [GroupName] [varchar](50) NULL) ON [PRIMARY]GOCREATE TABLE [dbo].[person]( [PersonID] [int] IDENTITY(1,1) NOT NULL, [NAME] [varchar](10) NULL) ON [PRIMARY]GOCREATE TABLE [dbo].[PersonGroups]( [PersonID] [int] NULL, [GroupID] [int] NULL) ON [PRIMARY]GOSET IDENTITY_INSERT [dbo].[groups] ON;BEGIN TRANSACTION;INSERT INTO [dbo].[groups]([GroupID], [GroupName])SELECT 1, N'Admin' UNION ALLSELECT 2, N'Accounting' UNION ALLSELECT 3, N'Support' UNION ALLSELECT 4, N'Legal' UNION ALLSELECT 5, N'Restricted'COMMIT;RAISERROR (N'[dbo].[groups]: Insert Batch: 1.....Done!', 10, 1) WITH NOWAIT;GOSET IDENTITY_INSERT [dbo].[groups] OFF;SET IDENTITY_INSERT [dbo].[person] ON;BEGIN TRANSACTION;INSERT INTO [dbo].[person]([PersonID], [NAME])SELECT 1, N'Tom' UNION ALLSELECT 2, N'Dick' UNION ALLSELECT 3, N'Harry' UNION ALLSELECT 4, N'Mary'COMMIT;RAISERROR (N'[dbo].[person]: Insert Batch: 1.....Done!', 10, 1) WITH NOWAIT;GOSET IDENTITY_INSERT [dbo].[person] OFF;BEGIN TRANSACTION;INSERT INTO [dbo].[PersonGroups]([PersonID], [GroupID])SELECT 1, 1 UNION ALLSELECT 1, 2 UNION ALLSELECT 1, 3 UNION ALLSELECT 1, 4 UNION ALLSELECT 2, 2 UNION ALLSELECT 2, 4 UNION ALLSELECT 3, 3 UNION ALLSELECT 4, 3COMMIT;RAISERROR (N'[dbo].[PersonGroups]: Insert Batch: 1.....Done!', 10, 1) WITH NOWAIT;GO
-- users with object-level permissions in current dbsp_helprotect NULL, NULL, NULL, 'o'-- users with server-level permissions in current dbsp_helprotect NULL, NULL, NULL, 's'-- Object-level permissions for all databasesIF OBJECT_ID('tempdb..#p','U') is not null DROP TABLE #Pcreate table #p( DBname nvarchar(500), Owner sysname, Object sysname, Grantee sysname, Grantor sysname, ProtectType varchar(100), Action varchar(100), [Column] varchar(100))EXEC sp_msforeachdb 'INSERT INTO #p(Owner, Object, Grantee, Grantor, ProtectType, Action, [Column]) exec ?.dbo.sp_helprotect NULL, NULL, NULL, ''o''UPDATE #p SET DBName=''?'' WHERE DBName IS NULL'select * from #p-- Roles grantedIF OBJECT_ID('tempdb..#g','U') is not null DROP TABLE #GCREATE TABLE #g( DBName varchar(100), UserName nvarchar(500), GroupName nvarchar(500), LoginName nvarchar(500), DefDBName nvarchar(500), DefSchemaName nvarchar(500), UserID int, SID image)exec sp_msforeachdb'insert into #g(UserName, GroupName, LoginName, DefDBName, DefSchemaName, UserID, SID) EXEC sp_helpuserUPDATE #g SET DBName=''?'' WHERE DBName IS NULL'SELECT * FROM #G
;WITH GroupsGrouped AS ( SELECT DISTINCT Groups=STUFF(( SELECT ',' + CAST(GroupID AS VARCHAR(5)) FROM PersonGroups b WHERE a.PersonID = b.PersonID ORDER BY GroupID FOR XML PATH('')), 1, 1, '') FROM personGroups a GROUP BY PersonID)SELECT RoleID, GroupNameFROM ( SELECT RoleID=ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) ,Groups FROM GroupsGrouped) a CROSS APPLY dbo.DelimitedSplit8K(Groups, ',') bINNER JOIN Groups c ON c.GroupID = b.Item