Sql-Server

列出 SQL Server 上的所有使用者進行審核

  • September 18, 2018

我正在使用 SQL Server Management Studio 17,並嘗試以有組織的方式列出所有要審核的使用者,並提及他們的數據庫名稱。

我嘗試了下面的查詢,但它顯示了不同時間表的使用者,並且一些使用者重複了。

exec sp_MSforeachdb 'select * from ?.sys.sysusers'

我可以使用/嘗試什麼?

使用者被顯示為“重複”只是因為每個數據庫都有自己的使用者

稍微擴展您的查詢可能會有所幫助,因此您可以查看每組使用者來自哪個數據庫:

exec sp_MSforeachdb 'select ''?'' as DBNAME, * from ?.sys.sysusers'

請注意LoginUser之間的重要區別:

登錄用於身份驗證

登錄驗證您可以訪問伺服器。

有兩種類型:SQL 登錄和 Windows 登錄。

登錄是在 SQL Server 實例級別創建的(並儲存在 master 中)。

一個使用者是為了授權

授權決定了您可以在數據庫中做什麼。

使用者需要連結到登錄。

使用者沒有密碼 - 登錄決定密碼的儲存位置。

將來自不同數據庫的使用者連結到伺服器上的單個登錄名是很常見的。

使用者(及其角色)儲存在每個數據庫中,而不是主數據庫中(參見Security > Users使用 SSMS 時在每個數據庫中)。

您還可以使用游標遍歷數據庫並獲取其使用者:

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

引用自:https://dba.stackexchange.com/questions/217867