1. ホーム
  2. sql-server

[解決済み] データベースの全ユーザーのリストを取得する方法

2023-05-26 02:29:30

質問

MS SQL Server の特定のデータベースにアクセスできる Windows ユーザーと 'sa' を含むすべてのユーザーのリストを取得するつもりです。 基本的に、私はリストが以下に示すように見えることを望みます。 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')

このクエリはほぼ正しいのですが、問題はこのクエリが 'dbo' の条件を満たしていないことです。

このクエリをどのように変更すればよいでしょうか、それとも別のクエリを使用すべきでしょうか。

どのように解決するのですか?

GUI (SSMS) で何かを「見た」ときに、「これは私が必要としているものだ」と思ったときはいつでも、Sql Profiler を実行して、使用されたクエリを検索することができます。

Sql Profiler を実行します。 もちろん、データベースにアタッチしてください。

そして、GUI(SSMS内)で右クリックし、"Refresh"をクリックしてください。

そして、Profiler "catch"を見てきてください。

MyDatabase / Security / Users で、"Users" をクリックすると、以下のように表示されました。

繰り返しますが、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