私はSQL Server Management Studio 17を使用しており、監査するすべてのユーザーを、データベース名を挙げて整理された方法で一覧表示しようとしています。
以下のクエリを試してみましたが、別のスケジュールでユーザーが表示され、一部のユーザーが重複しています。
exec sp_MSforeachdb 'select * from ?.sys.sysusers'
代わりに何を使用/試行できますか?
各データベースに独自のユーザーがあるため、ユーザーは「複製された」と表示されます。
クエリを少し拡張すると役立つ場合があります。これにより、各ユーザーセットがどのデータベースから来ているかを確認できます。
exec sp_MSforeachdb 'select ''?'' as DBNAME, * from ?.sys.sysusers'
Loginとserの重要な違いに注意してください。
LoginはAuthentication用です。
ログインは、サーバーにアクセスできることを確認します。
SQLログインとWindowsログインの2つのタイプがあります。
ログインはSQL Serverインスタンスレベルで作成されます(マスターに保存されます)。
A UserはAuthorization。
承認は、データベースで実行できることを決定します。
ユーザーはログインにリンクする必要があります。
ユーザーにはパスワードがありません-ログインにより、パスワードの保存場所が決定されます。
サーバー上の1つのログインにリンクされているさまざまなデータベースのユーザーがいるのはごく普通のことです。
ユーザー(およびそのロール)は、マスターではなく各データベースに保存されます(Security > Users
各データベースでSSMSを使用する場合)。
組み込み関数sp_helplogins
を試してみてください。
各データベースでのログインとそれらに関連付けられたユーザーに関する情報を提供します。
参照:sp_helplogins(Transact-SQL) (Microsoft | Docs | SQL Server)
単純な場合:
exec sp_helplogins
... 2つのウィンドウが表示されます。
最初のレポートには、次の表に示すように、指定された各ログインに関する情報が含まれています。
Column name Data type Description LoginName sysname Login name. SID varbinary(85) Login security identifier (SID). DefDBName sysname Default database that LoginName uses when connecting to an instance of SQL Server. DefLangName sysname Default language used by LoginName. Auser char(5) Yes = LoginName has an associated user name in a database. No = LoginName does not have an associated user name. ARemote char(7) Yes = LoginName has an associated remote login. No = LoginName does not have an associated login.
ログイン名| SID | DefDBName | DefLangName | AUser | ARemote ---------------------------------------- + --- -------------------------------------------------- --------------- + ----------- + ------------- + ------- + --------- ## MS_AgentSigningCertificate ## | 0x010600000000000901000000AB808B5B1F45E02462E89246B35D879D459D7BCB |マスター| us_english |はい|いいえ ## MS_PolicyEventProcessingLogin ## | 0x99533C1F5E0B584889BB3FA05C33ADC1 |マスター| us_english |はい|いいえ ## MS_PolicySigningCertificate ## | 0x0106000000000009010000006DFF93DB1C345982E5FF1D9148CA1CC1A605C5EC |マスター| NULL |いいえ|いいえ ## MS_PolicyTsqlExecutionLogin ## | 0xA9EEB439F4762546BD90D163703F6DA1 |マスター| us_english |はい|いいえ ## MS_SmoExtendedSigningCertificate ## | 0x010600000000000901000000044EFFBABE4DF3793E8DA9D60353CD089AC2C183 |マスター| NULL |いいえ|いいえ ## MS_SQLAuthenticatorCertificate ## | 0x0106000000000009010000001D9B4659FEDA4633E7989520152C8AFCCAF6430C |マスター| NULL |いいえ|いいえ ## MS_SQLReplicationSigningCertificate ## | 0x010600000000000901000000195A781158BF37965401996C9645207BFF20F765 |マスター| NULL |いいえ| ## MS_SQLResourceSigningCertificate ## | 0x010600000000000901000000922D2F20EB6613B78484357D75AFFAB066EAC58A |マスター| NULL |いいえ|いいえ NT Service\MSSQLSERVER | 0x010600000000000550000000E20F4FE7B15874E48E19026478C2DC9AC307B83E |マスター| us_english |いいえ|いいえ NT SERVICE\ReportServer | 0x010600000000000550000000214401ACF066EA342187301080455260EB684BA2 |マスター| us_english |はい| NT SERVICE\SQLSERVERAGENT | 0x010600000000000550000000DCA88F14B79FD47A992A3D8943F829A726066357 |マスター| us_english |いいえ|いいえ NT SERVICE\SQLWriter | 0x010600000000000550000000732B9753646EF90356745CB675C3AA6CD6B4D28B |マスター| us_english |いいえ|いいえ NT SERVICE\Winmgmt | 0x0106000000000005500000005A048DDFF9C7430AB450D4E7477A2172AB4170F4 |マスター| us_english |いいえ|いいえ NT-AUTORITÄT\ Netzwerkdienst | 0x010100000000000514000000 |マスター| us_english |いいえ|いいえ NT-AUTORITÄT\ SYSTEM | 0x010100000000000512000000 |マスター| us_english |はい|いいえ sa | 0x01 |マスター| us_english |はい| テストなし| 0x70F0AA94953CE7479682442D59C74CF5 |マスター| us_english |はい|番号
2番目のレポートには、次の表に示すように、各ログインにマップされたユーザーに関する情報と、ログインのロールメンバーシップが含まれています。
Column name Data type Description LoginName sysname Login name. DBName sysname Default database that LoginName uses when connecting to an instance of SQL Server. UserName sysname User account that LoginName is mapped to in DBName, and the roles that LoginName is a member of in DBName. UserOrAlias char(8) MemberOf = UserName is a role. User = UserName is a user account.
ログイン名| DBName |ユーザー名| UserOrAlias ----------------------------------- + -------- --------------- + ---------------------------------- + ----------- ## MS_AgentSigningCertificate ## |マスター| ## MS_AgentSigningCertificate ## |ユーザー ## MS_PolicyEventProcessingLogin ## |マスター| ## MS_PolicyEventProcessingLogin ## |ユーザー ## MS_PolicyEventProcessingLogin ## | msdb | ## MS_PolicyEventProcessingLogin ## |ユーザー ## MS_PolicyEventProcessingLogin ## | msdb | PolicyAdministratorRole | MemberOf ## MS_PolicyTsqlExecutionLogin ## | msdb | ## MS_PolicyTsqlExecutionLogin ## |ユーザー ## MS_PolicyTsqlExecutionLogin ## | msdb | PolicyAdministratorRole | MemberOf NT SERVICE\ReportServer |マスター| NT SERVICE\ReportServer |ユーザー NT SERVICE\ReportServer |マスター| RSExecRole | MemberOf NT SERVICE\ReportServer | msdb | NT SERVICE\ReportServer |ユーザー NT SERVICE\ReportServer | msdb | RSExecRole | MemberOf NT SERVICE\ReportServer | ReportServer | NT SERVICE\ReportServer |ユーザー NT SERVICE\ReportServer | ReportServer | RSExecRole | MemberOf NT SERVICE\ReportServer | ReportServerTempDB | NT SERVICE\ReportServer |ユーザー NT SERVICE\ReportServer | ReportServerTempDB | RSExecRole | MemberOf NT-AUTORITÄT\ SYSTEM | AdventureWorksDW2012 | db_owner | MemberOf NT-AUTORITÄT\ SYSTEM | AdventureWorksDW2012 | dbo |ユーザー sa |マスター| db_owner | MemberOf sa |マスター| dbo |ユーザー sa |モデル| db_owner | MemberOf sa |モデル| dbo |ユーザー sa | msdb | db_owner | MemberOf sa | msdb | dbo |ユーザー sa | tempdb | db_owner | MemberOf sa | tempdb | dbo |ユーザー test | StackExchange |テスト|ユーザー
これはあなたが探しているものかもしれません。
カーソルを使用してデータベースをループし、ユーザーを取得することもできます。
DECLARE @dbname NVARCHAR(255), @sql NVARCHAR(max)
DECLARE c CURSOR FORWARD_ONLY READ_ONLY FOR
SELECT name FROM sys.databases
WHERE database_id > 4;
OPEN c
FETCH NEXT FROM c INTO @dbname ;
WHILE @@fetch_status = 0
BEGIN
set @sql =
'use '+@dbname+'
select '''+@dbname+''',*
from sys.sysusers
where name not in
(''public''
,''dbo''
,''guest''
,''INFORMATION_SCHEMA''
,''sys''
,''db_owner''
,''db_accessadmin''
,''db_securityadmin''
,''db_ddladmin''
,''db_backupoperator''
,''db_datareader''
,''db_datawriter''
,''db_denydatareader''
,''db_denydatawriter'')';
EXEC (@sql);
FETCH NEXT FROM c INTO @dbname;
END
CLOSE C
DEALLOCATE c