列出某个用户的所有数据库(SQL Server 2008 R2)

Rac*_*SQL 5 permissions sql-server-2008-r2

我真的在寻找这个答案有一段时间了。我敢打赌这里有一个帖子,但是,我真的找不到(即使在 google 上)。

我认为这是一项简单的任务。

我想列出特定用户的所有数据库。

有没有办法做到这一点?

它可以是视图或游标。我就是想不出什么。

Aar*_*and 9

您可以模拟该登录名并使用HAS_DBACCESS内置函数

USE master;
GO
EXECUTE AS LOGIN = N'your_login_name';
GO
SELECT name, HAS_DBACCESS(name) 
  FROM sys.databases;
GO
REVERT;
Run Code Online (Sandbox Code Playgroud)

如果需要查找每个数据库中的用户映射(例如数据库中的用户名并不总是与登录名相同),则可以使用动态SQL,例如

CREATE TABLE #db(name SYSNAME);
GO
use master;
GO
EXECUTE AS LOGIN = 'floob';
GO
INSERT #db(name)
  SELECT name FROM sys.databases
  WHERE HAS_DBACCESS(name) = 1
  AND database_id > 4; -- don't really care about system DBs, right?
GO
REVERT;
GO

DECLARE @sql NVARCHAR(MAX) = N'', @login SYSNAME = N'floob';

SELECT @sql += N'
  UNION ALL 
  SELECT login = @login, db = ''' + QUOTENAME(name) + N''', 
    username = p.name 
    FROM ' + QUOTENAME(name) + N'.sys.database_principals AS p
    WHERE sid = SUSER_SID(@login)'
  FROM #db;

SET @sql = STUFF(@sql, 1, 11, N'');
EXEC sys.sp_executesql @sql, N'@login SYSNAME', @login;
GO
DROP TABLE #db;
GO
Run Code Online (Sandbox Code Playgroud)