查询用户可以作为管理员访问的所有数据库

时间:2012-06-14 16:18:12

标签: sql-server sql-server-2005

我希望查询映射到用户的所有数据库,类似于Security>登录>属性>用户映射。

如果可能,这可以在SQL 2005中完成

例如,类似于:

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

但是,从管理用户执行查询,而不是以用户本身身份运行上述查询。

如何执行此类操作?

谢谢。

2 个答案:

答案 0 :(得分:2)

这可能是一个开始,可能不是你希望的好输出(它产生两个结果集):

EXEC sp_helplogins N'floob';

但它确实可以在SQL Server 2000上运行。如果你想尝试复制过程中的一些功能,你可以看到它是如何检查权限的,基本上是每个数据库的游标。在SQL Server 2000上:

EXEC sp_helptext N'sp_helplogins';

2005年以上我更喜欢OBJECT_DEFINITION()的输出:

SELECT OBJECT_DEFINITION(OBJECT_ID(N'sys.sp_helplogins'));

所以你可以根据类似的逻辑编写自己的光标,并使输出更漂亮......

这是一个快速(而非完整)的例子,并没有涵盖很多,但如果上述内容不充分,可以开始使用:

DECLARE @login NVARCHAR(255);
SET @login = N'foobarblat';

-- above would be an input parameter to a procedure, I presume

CREATE TABLE #dbs(name SYSNAME);

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';

SELECT @sql = @sql + N'INSERT #dbs SELECT ''' + name + ''' FROM ' 
  + QUOTENAME(name) + '.sys.database_principals AS u
  INNER JOIN sys.server_principals AS l
  ON u.sid = l.sid
  WHERE l.name = @login;'
FROM sys.databases 
WHERE state_desc = 'ONLINE'
AND user_access_desc = 'MULTI_USER';

EXEC sp_executesql @sql, N'@login SYSNAME', @login;

SELECT name FROM #dbs;

DROP TABLE #dbs;

正如我所说,这还不完整。不知道用户是否被拒绝连接,是拒绝读写器角色的成员,如果db中的用户名与登录名不匹配,则不会显示别名等。可以从sp_helplogins深入了解更多细节,具体取决于您想要展示的内容。

答案 1 :(得分:0)

2005版本中添加了EXECUTE AS功能,所以我认为你不能在2000年运行它。你可以通过将相关代码放在一个作业中并将作业所有者设置为一个来模仿它。管理员用户,但它将处理不是内联的作业。