2010-01-27 5 views
7

Я использую SQL 2000 и SQL 2005.TSQL знать член роли базы данных

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

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

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

ответ

18

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

SELECT 
    USER_NAME(memberuid), USER_NAME(groupuid) 
FROM 
    sys.sysmembers 
WHERE 
    USER_NAME(groupuid) IN ('db_owner', 'db_accessadmin') 
+1

Большое спасибо. И запустить его во всей базе данных я сделал: 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

+0

Извините, я сделал это на своем локальном SQL Server, но забыл опубликовать его! – gbn

3

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

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 
+0

tHANKS. КАК МОЖНО ЛИ ПОТЕРЯТЬ В sql 2000? – Manjot

+0

Не работает в SQL Server 2000 ... – gbn

Смежные вопросы