如何获取所有数据库用户的列表


72

我将获取所有有权访问MS SQL Server中特定数据库的用户的列表,包括Windows用户和“ sa”。基本上,我希望列表看起来像显示的样子SQL Server Management Studio(即,展开时显示的列表[databse] -> Security -> Users),但有一个重要的例外:我不想'dbo'在列表中看到。相反,我希望看到拥有该数据库的实际用户。因此,例如,如果'sa'是'dbo',则'sa'必须将其包含在列表中,而不是'dbo'。另一个不容错过的注意事项是,该列表中的列表SQL Server Management Studio通常显示Windows用户和SQL用户,而且我希望这些用户也包括在内。

到目前为止,我已经能够提出以下查询:

SELECT * FROM sys.database_principals where (type='S' or type = 'U')

该查询几乎是正确的,但问题是它不满足'dbo'条件。

如何更改此查询或应该使用另一个查询?

Answers:



36
EXEC sp_helpuser

要么

SELECT * FROM sysusers

这两个都选择当前数据库(而不是服务器)的所有用户。


4
EXEC sp_helpuser非常适合我无法访问所有sys表的RDS-谢谢!
TJ Biddle

10

每当您在GUI(SSMS)中“看到”某些东西时,就像“这就是我需要的”一样,您始终可以运行Sql Profiler来查找所使用的查询。

运行Sql Profiler。将它附加到您的数据库中。

然后右键单击GUI(在SSMS中),然后单击“刷新”。
然后去查看Profiler的“捕捉”之处。

当我位于MyDatabase / Security / Users中时,得到以下内容,然后单击“ Users”上的“ refresh”。

同样,我没有提出WHERE子句和LEFT OUTER JOIN,它是SSMS查询的一部分。而且此查询是Microsoft的某人写的(您知道,专家了解内而外的专家,也就是专家),因此他们熟悉数据库中所有奇怪的“标志”。

但是SSMS / GUI-> Sql Profiler技巧可以在许多情况下使用。

SELECT
u.name AS [Name],
'Server[@Name=' + quotename(CAST(
        serverproperty(N'Servername')
       AS sysname),'''') + ']' + '/Database[@Name=' + quotename(db_name(),'''') + ']' + '/User[@Name=' + quotename(u.name,'''') + ']' AS [Urn],
u.create_date AS [CreateDate],
u.principal_id AS [ID],
CAST(CASE dp.state WHEN N'G' THEN 1 WHEN 'W' THEN 1 ELSE 0 END AS bit) AS [HasDBAccess]
FROM
sys.database_principals AS u
LEFT OUTER JOIN sys.database_permissions AS dp ON dp.grantee_principal_id = u.principal_id and dp.type = 'CO'
WHERE
(u.type in ('U', 'S', 'G', 'C', 'K' ,'E', 'X'))
ORDER BY
[Name] ASC

6
SELECT name FROM sys.database_principals WHERE
type_desc = 'SQL_USER' AND default_schema_name = 'dbo'

这将选择管理员创建的SQL Server中的所有用户!


3
与SQL Azure数据库一起使用
Philippe

此过滤器是不正确的,因为您仅获得具有default_schema_name ='dbo'的用户,但您创建的用户也可以具有不同的default_schema_name(dbo是默认用户,但您可以创建另一个)
Ronen Ariely


1

我尽量避免使用“ SELECT *”选项,而只提取我想要或需要的数据。下面的代码是我使用的代码,您可以根据需要删除或添加列和别名。

我也使用“ IIF”(如果是立即)将二进制0或1替换为是或否。对于那些可能需要此信息的非技术人员来说,它只是使阅读起来更容易。

这是我用的:

SELECT 
    name AS 'User'
  , PRINCIPAL_ID
  , type AS 'User Type'
  , type_desc AS 'Login Type'
  , CAST(create_date AS DATE) AS 'Date Created' 
  , default_database_name AS 'Database Name'
  , IIF(is_fixed_role LIKE 0, 'No', 'Yes') AS 'Is Active'
FROM master.sys.server_principals
WHERE type LIKE 's' OR type LIKE 'u'
ORDER BY [User], [Database Name]; 
GO

希望这可以帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.