2010-01-27 4 views
7

Ich bin mit SQL 2000 und SQL 2005TSQL wissen, Datenbankrolle Mitglieder

Ich möchte wissen, welche Anmeldungen db_owner oder db_accessadmin Rechte haben, an die Datenbanken.

Ich kann auf Benutzer oder Datenbankrollen in jeder Datenbank klicken, um das zu sehen. Könnte dies einfacher mit TSQL gemacht werden?

Vielen Dank im Voraus

Antwort

18

für SQL 2000 und arbeitet nach wie vor für SQL 2005 zu

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

Vielen Dank. Und um es in allen Datenbanken auszuführen, habe ich folgendes gemacht: EXEC SP_MSFOREACHDB 'USE [?]; SELECT \t \t \t \t DB_NAME(), USER_NAME (memberUid), USER_NAME (groupuid) \t \t \t \t FROM \t \t \t \t sysmembers \t \t \t \t WHERE \t \t \t \t USER_NAME (groupuid) IN ('' db_owner '', '' db_accessadmin '') \t \t \t \t und user_name (memberuid) nicht wie ''% dbo% '' ' – Manjot

+0

Entschuldigung, ich habe das in meinem lokalen SQL Server gemacht, aber vergessen, es zu posten! – gbn

3

Es ist schlampig und es ist wahrscheinlich eine bessere Art und Weise, aber das sollte es tun, wenn dies eine Sache einmalig ist:

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 

Die SQL 2000-Version sein sollte:

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. Wie kann ich es in SQL 2000 ausführen? – Manjot

+0

Funktioniert nicht in SQL Server 2000 ... – gbn