Question

I need to know all databases in a SQL Server on which a user can connect. With sys.databases I get all databases and with sys.server_principals or sys.syslogins I get all server logons. But I can't find a table which contains a connection between these tables. Has anyone an idea how to solve this? Thanks.

Was it helpful?

Solution

You should be able to do something like this:

EXECUTE AS login = 'loginname';

SELECT name
FROM sys.databases
WHERE HAS_DBACCESS(name) = 1;

REVERT;

For reference see EXECUTE AS and HAS_DBACCESS

OTHER TIPS

This should put you in the right direction:

DECLARE @results TABLE (
    database_name sysname,
    db_user_name sysname,
    login_name sysname
);

INSERT @results
EXEC sp_MsForEachDB '
USE [?];
SELECT DB_NAME() AS database_name,
    dp.name AS db_user_name, 
    sp.name AS login_name
FROM sys.database_principals dp
INNER JOIN sys.server_principals sp 
    ON sp.sid = dp.sid
';

SELECT *
FROM @results;

P.S. sp_MsForEachDB is ugly, undocumented and unreliable, but it's just to show you how the information is stored in each individual database.

Licensed under: CC-BY-SA with attribution
Not affiliated with dba.stackexchange
scroll top