web-dev-qa-db-ja.com

SQL Serverで過去X日間にログインしたログインのクエリリスト

過去X日間にSQLサーバーに接続したログインを一覧表示するsys.dm_exec_sessionsやsys.dm_exec_connectionsなどの内部システムオブジェクトを含む適切なクエリはありますか? 15日、30日?また、これに役立つまたは関連する可能性のある他のクエリも探しています。

2
PolDBQ

@Tiborで述べたように、ロギングまたはトレースを設定しない限り、その情報をネイティブで取得することはできません。トリガーを使用する必要はありません。

SQL Server Management Studioの使用

ログイン監査の構成(SQL Server Management Studio) 上で設定したら、エラーログをクエリして情報を取得できます。日付をテーブルに保存することもできます。 このブログ投稿 でエラーログからの読み取り方法を説明しました。

拡張イベントトレースの使用

監査ログインイベントクラス

Audit Loginイベントクラスは、ユーザーがMicrosoft SQL Serverに正常にログインしたことを示します。このクラスのイベントは、新しい接続または接続プールから再利用される接続によって発生します。

Steve Jonesは彼のブログ投稿で詳細を説明しています: Tracking Logins with Extended Events

4
SqlWorldWide

OK、そのため、この時点ではロギングはオンになっていません。最初のステップは、あなたに合ったタイプのロギングをオンにすることです。頭に浮かぶのは:

  • SSMSを使用して、レジストリへの成功したログインのログをオンにします。 @SqlWorldWideの別の回答で説明されています。これは、EventLogとerrorlogファイルにも送られます。
  • XEトレースを使用します。繰り返しますが、すでに@SqlWorldWideによって説明されています。
  • サーバー監査機能(XEに基づいて構築されています)の使用。 XEを直接使用する方がおそらく目的に応じて柔軟性がありますが、おそらくServer Auditを使用すると、XEを直接使用する場合にはない洞察/情報/機能を提供できます。
  • 古いトレースエンジン「SQLトレース」を使用します。これは非推奨であるため、このルートは使用しません。
  • ログオントリガーの使用。トリガーによって、後でクエリするテーブルに行が挿入されることはほとんどありません。

どちらか一方を推奨することは困難です(ただし、古いトレースエンジンは推奨しません)。あなただけが、あなたがより快適であるものとあなたの要件を知っています。 XEベースのメソッドまたはログオントリガーのいずれかを使用すると、データのクエリに関して、もう少し堅牢に感じられます。

XEベースのメソッドの場合、いくつかのXQueryを含むトレースファイルをクエリできます。以下は、XMLを列に解析するXQueryを含むSQLクエリの例です。監査トレースに直接基づくものではありませんが、それはあなたにアイデアを与えます。

--XML from file
SELECT CAST(event_Data AS xml) AS event_data 
FROM sys.fn_xe_file_target_read_file('R:\SqlStatements*.xel', NULL, NULL, NULL)

--Each event is one row

DROP TABLE IF EXISTS #myXeData

SELECT CAST(event_Data AS XML) AS StatementData
INTO #myXeData
FROM sys.fn_xe_file_target_read_file('R:\SqlStatements*.xel', NULL, NULL, NULL)

SELECT * FROM #myXeData


--Use XQuery to transform to table. 
SELECT 
 StatementData.value('(event/@name)[1]', 'varchar(50)') AS event_name
,StatementData.value('(event/@timestamp)[1]', 'datetime2(0)') AS time_stamp
,StatementData.value('(event/action[@name="database_name"]/value)[1]','nvarchar(128)') AS database_name_
,StatementData.value('(event/data[@name="duration"]/value)[1]','bigint') / 1000 AS duration_ms
,StatementData.value('(event/data[@name="cpu_time"]/value)[1]','bigint') /1000 AS cpu_ms
,StatementData.value('(event/data[@name="physical_reads"]/value)[1]','bigint') AS physical_reads
,StatementData.value('(event/data[@name="logical_reads"]/value)[1]','bigint') AS logical_reads
,StatementData.value('(event/data[@name="row_count"]/value)[1]','bigint') AS row_count
,StatementData.value('(event/data[@name="statement"]/value)[1]','nvarchar(50)') AS statement_
FROM #myXeData AS evts
--ORDER BY time_stamp
ORDER BY duration_ms DESC
2
Tibor Karaszi