我正在查询映射到用户的所有数据库,类似于安全 > 登录 > 属性 > 用户映射。
如果可能,这可以在 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;
正如我所说,这并不完整。不知道用户是否已被拒绝连接,是否是拒绝读/写角色的成员,如果数据库中的用户名与登录名不匹配,则不会显示别名等。您可以从sp_helplogins
取决于你想展示什么。
EXECUTE AS功能是在 2005 版本中添加的,因此我认为您无法在 2000 年运行它。您可以通过将相关代码放入作业并将作业所有者设置为管理员用户来模仿它,但它会与作业不内联的过程。