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