過去X日間にSQLサーバーに接続したログインを一覧表示するsys.dm_exec_sessionsやsys.dm_exec_connectionsなどの内部システムオブジェクトを含む適切なクエリはありますか? 15日、30日?また、これに役立つまたは関連する可能性のある他のクエリも探しています。
@Tiborで述べたように、ロギングまたはトレースを設定しない限り、その情報をネイティブで取得することはできません。トリガーを使用する必要はありません。
ログイン監査の構成(SQL Server Management Studio) 上で設定したら、エラーログをクエリして情報を取得できます。日付をテーブルに保存することもできます。 このブログ投稿 でエラーログからの読み取り方法を説明しました。
Audit Loginイベントクラスは、ユーザーがMicrosoft SQL Serverに正常にログインしたことを示します。このクラスのイベントは、新しい接続または接続プールから再利用される接続によって発生します。
Steve Jonesは彼のブログ投稿で詳細を説明しています: Tracking Logins with Extended Events
OK、そのため、この時点ではロギングはオンになっていません。最初のステップは、あなたに合ったタイプのロギングをオンにすることです。頭に浮かぶのは:
どちらか一方を推奨することは困難です(ただし、古いトレースエンジンは推奨しません)。あなただけが、あなたがより快適であるものとあなたの要件を知っています。 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