2010-01-27 1 views
7

Sto usando SQL 2000 e SQL 2005.TSQL sapere membri del ruolo di database

Vorrei sapere che gli accessi hanno db_owner o db_accessadmin diritti ai quali basi di dati.

Posso fare clic sugli utenti o sui ruoli del database in ogni database per vederlo. Questo può essere fatto in modo più semplice usando TSQL?

Grazie in anticipo

risposta

18

per SQL 2000 e ancora lavora per SQL 2005 anche

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

Grazie mille. E per eseguirlo in tutti i database che ho fatto: EXEC SP_MSFOREACHDB 'USE [?]; SELEZIONA \t \t \t \t DB_NAME(), USER_NAME (memberUid), USER_NAME (groupuid) \t \t \t \t DA \t \t \t \t sysmembers \t \t \t \t DOVE \t \t \t \t USER_NAME (groupuid) IN ('' db_owner '', '' db_accessadmin '') \t \t \t \t e user_name (memberuid) non come ''% dbo% '' ' – Manjot

+0

scusate, l'ho fatto nel mio SQL Server locale ma ho dimenticato di postarlo! – gbn

3

E 'sciatta e non v'è probabilmente un modo migliore, ma questo dovrebbe avere fatto se questa è una cosa di una volta:

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 

La versione 2000 di SQL dovrebbe essere:

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. hOW CAN I RUN IT IN sql 2000? – Manjot

+0

Non funzionerà in SQL Server 2000 ... – gbn