2012-06-14 43 views
0

我正在查询映射到用户的所有数据库,类似于安全>登录>属性>用户映射。查询用户有权以管理员身份访问的所有数据库

这可以在SQL 2005可以做,如果可能的

例如,类似于:

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

但是从管理用户进行查询,而不是运行上面的查询作为用户本身。

这样的事情会被执行吗?

谢谢。

+0

为什么'sys.sysdatabases'(它只是为了向后兼容的原因)而不是'sys.databases'? –

+0

出于这个确切原因,向后兼容。我与2000年,2005年,2008年和2008R2实例合作。 –

+0

使用sys.database_principals和sys.database_permissions,您可以了解用户名,类型及其权限 – praveen

回答

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中的用户名与登录等不匹配,则不会显示别名。您可以从中获得更多详细信息取决于你想要显示的内容。

0

EXECUTE AS功能是在2005年发布的版本中添加的,因此我认为您不能在2000年运行该功能。您可以将相关代码放入作业并将作业所有者设置为管理员用户,但它会处理与作业不内联。

相关问题