我将获得所有用户的列表,包括Windows用户和“sa”,他们可以访问MS SQL Server中的特定数据库。
基本上,我希望列表看起来像SQL Server Management Studio
中显示的内容(即展开[databse] -> Security -> Users
时显示的列表),但有一个重要的例外:我不希望看到{{ 1}}在列表中。相反,我希望看到拥有数据库的实际用户。因此,例如,如果“sa”是'dbo'
,则'dbo'
必须包含在列表中而不是'sa'
中。另一个不容错过的注意事项是,'dbo'
中的列表除了SQL用户之外通常还会显示Windows用户,并且我希望也包括这些用户。
到目前为止,我已经能够提出以下问题:
SQL Server Management Studio
此查询几乎正确,但问题是它不满足SELECT * FROM sys.database_principals where (type='S' or type = 'U')
条件。
如何更改此查询或应该使用其他查询?
答案 0 :(得分:78)
对于SQL Server所有者,您应该能够使用:
select suser_sname(owner_sid) as 'Owner', state_desc, *
from sys.databases
有关SQL用户的列表:
select * from master.sys.server_principals
参考。 SQL Server Tip: How to find the owner of a database through T-SQL
答案 1 :(得分:21)
EXEC sp_helpuser
或
SELECT * FROM sysusers
这两个选择当前数据库(而不是服务器)的所有用户。
答案 2 :(得分:4)
SELECT name FROM sys.database_principals WHERE
type_desc = 'SQL_USER' AND default_schema_name = 'dbo'
这将选择管理员创建的SQL Server中的所有用户!
答案 3 :(得分:1)
每当您在GUI(SSMS)中“看到”某些内容时,就像“这就是我需要的”一样,您始终可以运行Sql Profiler来查找所使用的查询。
运行Sql Profiler。将它附加到您的数据库中。
然后右键单击GUI(在SSMS中),然后单击“刷新”。
然后看看Profiler会“捕获”什么。
当我位于MyDatabase / Security / Users中时,得到以下内容,然后单击“ Users”上的“ refresh”。
同样,我没有提出WHERE子句和LEFT OUTER JOIN,这是SSMS查询的一部分。
但是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
答案 4 :(得分:0)
我尽量避免使用“ 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
希望这会有所帮助。
答案 5 :(得分:0)
为此:
SELECT name,type_desc FROM sys.sql_logins