TSQL, чтобы знать членов роли базы данных

Я использую SQL 2000 и SQL 2005.

Я хочу знать, какие логины имеют права db_owner или db_accessadmin для каких баз данных.

Я могу щелкнуть пользователей или роли базы данных в каждой базе данных, чтобы увидеть это. Можно ли это сделать проще, используя TSQL?

заранее спасибо


person Manjot    schedule 27.01.2010    source источник


Ответы (2)


Для SQL 2000 и до сих пор работает и для SQL 2005

SELECT
    USER_NAME(memberuid), USER_NAME(groupuid)
FROM
    sys.sysmembers
WHERE
    USER_NAME(groupuid) IN ('db_owner', 'db_accessadmin')
person gbn    schedule 27.01.2010
comment
Большое тебе спасибо. И чтобы запустить его во всей базе данных, я сделал: EXEC SP_MSFOREACHDB 'USE [?] ; ВЫБЕРИТЕ DB_NAME(),USER_NAME(memberuid), USER_NAME(groupuid) FROM sysmembers, ГДЕ USER_NAME(groupuid) IN (''db_owner'', ''db_accessadmin'') и user_name(memberuid) не похожи на ''%dbo%''' - person Manjot; 28.01.2010
comment
извините, я сделал это на своем локальном SQL Server, но забыл опубликовать это! - person gbn; 28.01.2010

Это небрежно, и, вероятно, есть лучший способ, но это должно сделать это, если это одноразовая вещь:

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
person Tom H    schedule 27.01.2010
comment
Благодарю. КАК Я МОГУ ЗАПУСТИТЬ ЭТО В sql 2000? - person Manjot; 27.01.2010