thanks to this article for the base script. i needed to get a list of all users and the roles they had in each db. this script is great in that you can use the raw base script (mine is slightly modified) and list things for every object instead of just at the db level. in my case and in most people's case i imagine that makes this dataset rather large. this allowed me to get a large union on the raw data i needed for all of the databases and then i could put it one table so i could work with it to restructure a lot of permissions without having to requery over and over again. i don't have sa rights so this also gave me the ability to ask for sa rights briefly in order to accomplish this and then i could be taken off. if you had a less nice sa, this should give you the ability to give them something that only takes them like 10 minutes to do. =)
mostly like all things i'm just posting this so i don't forget it ha!
I just did this: sp_msforeachdb 'print ''USE ?GO WITH perms_cte as( select USER_NAME(p.grantee_principal_id) AS principal_name, dp.principal_id, dp.type_desc AS principal_type_desc, p.class_desc, OBJECT_NAME(p.major_id) AS object_name, p.permission_name, p.state_desc AS permission_state_desc from ?.sys.database_permissions p inner JOIN ?.sys.database_principals dp on p.grantee_principal_id = dp.principal_id where class_desc is null)--usersSELECT * INTO somewhere.DBO.R1_? FROM (SELECT [db]=db_name(), p.principal_name, p.principal_type_desc, p.class_desc, p.[object_name], p.permission_name, p.permission_state_desc, cast(NULL as sysname) as role_nameFROM perms_cte pWHERE principal_type_desc <> ''''DATABASE_ROLE''''UNION--role membersSELECT [db]=db_name(),rm.member_principal_name, rm.principal_type_desc, p.class_desc, p.object_name, p.permission_name, p.permission_state_desc,rm.role_nameFROM perms_cte pright outer JOIN ( select role_principal_id, dp.type_desc as principal_type_desc, member_principal_id,user_name(member_principal_id) as member_principal_name,user_name(role_principal_id) as role_name--,* from ?.sys.database_role_members rm INNER JOIN ?.sys.database_principals dp ON rm.member_principal_id = dp.principal_id) rmON rm.role_principal_id = p.principal_id) X''' Then ran the results to get the data for each db, then I ran this: sp_msforeachdb 'print ''UNION ALL SELECT * FROM somewhere.DBO.R1_? '' '
and removed the first union and I had my data. Plus I have all the root tables in the somewhere database to work with temporarily.