web-dev-qa-db-fra.com

Liste des identificins de la requête qui ont connecté les derniers jours x sur SQL Server

Y a-t-il une bonne requête qui comprenait des objets système internes tels que sys.dm_exec_sessions ou sys.dm_exec_connections qui répertorieraient les connexions connectées au serveur SQL au cours des x derniers jours? 15, 30 jours? Je cherche également toute autre requête qui peut aider ou liée à cela.

2
PolDBQ

Comme mentionné par @tibor, sauf si vous avez configuré la journalisation ou la trace, vous ne pouvez pas récupérer ces informations de manière native. Vous n'avez pas besoin d'utiliser la gâchette.

Utilisation de SQL Server Management Studio

Configurez l'audit de connexion (SQL Server Management Studio) Une fois que vous avez configuré ci-dessus, vous pouvez interroger le journal d'erreur et récupérer les informations. Vous pouvez également enregistrer la date dans une table. J'ai décrit dans ce blog post Comment lire à partir du journal des erreurs.

Utilisation de la trace d'événement étendu

Classe d'événement de connexion d'audit

La classe d'événement de connexion d'audit indique qu'un utilisateur s'est connecté avec succès à Microsoft SQL Server. Les événements de cette classe sont tirés par de nouvelles connexions ou par des connexions réutilisées à partir d'un pool de connexion.

Steve Jones a expliqué en détail dans son poteau de blog: suivi des connexions avec des événements étendus

4
SqlWorldWide

Ok, donc aucune journalisation allumée à ce stade. La première étape consiste à allumer le type de journalisation qui vous convient. Ceux qui viennent à l'esprit sont:

  • Allumant la journalisation des connexions avec succès dans le registre, en utilisant SSMS. Comme décrit par @sqlworldwide dans une autre réponse. Cela va à l'événement, ainsi que le fichier d'erreurLog.
  • En utilisant Xe Trace. Encore une fois, déjà expliqué par @sqlworldwide.
  • Utilisation de la fonctionnalité d'audit de serveur (qui est construite sur XE). L'utilisation du XE directement est probablement plus flexible à vos besoins, mais peut-être l'audit de serveur peut vous donner des idées/informations/fonctionnalités qui utilisent directement XE N'A PAS.
  • Utilisation de l'ancien moteur de trace, "SQL TRACE". Ceci est obsolète, alors je n'irais pas cette voie.
  • En utilisant des déclencheurs de connexion. Votre déclencheur ne serait pas probablement inséré une rangée dans une table, que vous interrogeez plus tard.

Il est difficile pour nous de recommander un sur l'autre (sauf que je ne recommande pas l'ancien moteur de trace). Seulement vous savez ce que vous êtes plus à l'aise et vos besoins. L'utilisation de l'une des méthodes xe ou des déclencheurs de connexion est un peu plus robuste pour moi lorsqu'il s'agit d'interroger les données.

Pour les méthodes basées sur XE, vous pouvez interroger un fichier de trace impliquant de XQuery. Vous trouverez ci-dessous un exemple de requête SQL contenant XQuery pour analyser XML dans des colonnes. Pas directement basé sur une trace d'audit, mais cela vous donne une idée.

--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