Это неаккуратно и есть, вероятно, лучший способ, но это должно сделать это, если это одноразовая вещь:
DECLARE
@db_name SYSNAME,
@sql VARCHAR(1000)
DECLARE db_cursor CURSOR FOR SELECT Name FROM sys.databases
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @db_name
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @sql =
'SELECT
''' + @db_name + ''' AS [Database],
USER_NAME(role_principal_id) AS [Role],
USER_NAME(member_principal_id) AS [User]
FROM
' + @db_name + '.sys.database_role_members
WHERE
USER_NAME(role_principal_id) IN (''db_owner'', ''db_accessadmin'')'
EXEC(@sql)
FETCH NEXT FROM db_cursor INTO @db_name
END
CLOSE db_cursor
DEALLOCATE db_cursor
версия SQL 2000 должна быть:
DECLARE
@db_name SYSNAME,
@sql VARCHAR(1000)
DECLARE db_cursor CURSOR FOR SELECT Name FROM master..sysdatabases
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @db_name
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @sql =
'SELECT
''' + @db_name + ''' AS [Database],
USER_NAME(memberuid) AS [Role],
USER_NAME(groupuid) AS [User]
FROM
sysmembers
WHERE
USER_NAME(groupuid) IN (''db_owner'', ''db_accessadmin'')'
EXEC(@sql)
FETCH NEXT FROM db_cursor INTO @db_name
END
CLOSE db_cursor
DEALLOCATE db_cursor
Большое спасибо. И запустить его во всей базе данных я сделал: EXEC SP_MSFOREACHDB 'USE [?]; ВЫБОР \t \t \t \t DB_NAME(), USER_NAME (memberuid), USER_NAME (groupuid) \t \t \t \t ОТ \t \t \t \t sysmembers \t \t \t \t ГДЕ \t \t \t \t USER_NAME (groupuid) IN ('' db_owner '', '' db_accessadmin '') \t \t \t \t и user_name (memberuid) не нравится ''% dbo% '' ' – Manjot
Извините, я сделал это на своем локальном SQL Server, но забыл опубликовать его! – gbn