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

RGO*_*RGO 59 sql-server

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

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

SELECT * FROM sys.database_principals where (type='S' or type = 'U')
Run Code Online (Sandbox Code Playgroud)

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

如何更改此查询或应该使用其他查询?

Lep*_*tor 86

对于SQL Server所有者,您应该能够使用:

select suser_sname(owner_sid) as 'Owner', state_desc, *
from sys.databases
Run Code Online (Sandbox Code Playgroud)

有关SQL用户的列表:

select * from master.sys.server_principals
Run Code Online (Sandbox Code Playgroud)

参考. SQL Server提示:如何通过T-SQL查找数据库的所有者

如何测试SQL Server中是否存在用户?

  • “ master.sys.server_principals”产生服务器登录列表,而不是数据库用户列表。 (3认同)

Ved*_*ran 28

EXEC sp_helpuser
Run Code Online (Sandbox Code Playgroud)

要么

SELECT * FROM sysusers
Run Code Online (Sandbox Code Playgroud)

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

  • `EXEC sp_helpuser`非常适合RDS,我无法访问所有sys表 - 谢谢! (4认同)

小智 6

SELECT name FROM sys.database_principals WHERE
type_desc = 'SQL_USER' AND default_schema_name = 'dbo'
Run Code Online (Sandbox Code Playgroud)

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

  • 与SQL Azure数据库一起使用 (3认同)

gra*_*der 6

每当您在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
Run Code Online (Sandbox Code Playgroud)


Sam*_*eer 5

去这个:

 SELECT name,type_desc FROM sys.sql_logins
Run Code Online (Sandbox Code Playgroud)