我正在查询映射到用户的所有数据库,类似于安全>登录>属性>用户映射。查询用户有权以管理员身份访问的所有数据库
这可以在SQL 2005可以做,如果可能的
例如,类似于:
SELECT name
FROM sys.databases
WHERE HAS_DBACCESS(name) = 1
但是从管理用户进行查询,而不是运行上面的查询作为用户本身。
这样的事情会被执行吗?
谢谢。
我正在查询映射到用户的所有数据库,类似于安全>登录>属性>用户映射。查询用户有权以管理员身份访问的所有数据库
这可以在SQL 2005可以做,如果可能的
例如,类似于:
SELECT name
FROM sys.databases
WHERE HAS_DBACCESS(name) = 1
但是从管理用户进行查询,而不是运行上面的查询作为用户本身。
这样的事情会被执行吗?
谢谢。
嗯,这可能是一个开始,可能不是很好的输出,你会为希望(和它产生两个结果):
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中的用户名与登录等不匹配,则不会显示别名。您可以从中获得更多详细信息取决于你想要显示的内容。
EXECUTE AS功能是在2005年发布的版本中添加的,因此我认为您不能在2000年运行该功能。您可以将相关代码放入作业并将作业所有者设置为管理员用户,但它会处理与作业不内联。
为什么'sys.sysdatabases'(它只是为了向后兼容的原因)而不是'sys.databases'? –
出于这个确切原因,向后兼容。我与2000年,2005年,2008年和2008R2实例合作。 –
使用sys.database_principals和sys.database_permissions,您可以了解用户名,类型及其权限 – praveen