Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/01/2011, 17h53   #1
Membre à l'essai
 
Inscription : juillet 2008
Messages : 92
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 92
Points : 21
Points : 21
Par défaut [SQL 2005] Audit d'un select

Bonjour,

Je souhaiterais faire un audit sur une table contenant des infos sensibles.

Je voudrais auditer les requêtes de type "select" qui y sont faites et enregistrer les résultats de l'audit dans une table.

Est-ce que c'est faisable sous SQL Server 2005 ?

Merci
mad_martigan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 22h12   #2
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 138
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 138
Points : 2 466
Points : 2 466
Envoyer un message via Yahoo à zinzineti
SQLPro
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 09h19   #3
Membre à l'essai
 
Inscription : juillet 2008
Messages : 92
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 92
Points : 21
Points : 21
La solution proposée par SQLPro ne fonctionne que sur la version 2008.

Qu'en est-il pour SQL Server 2005 ?

Merci
mad_martigan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 11h42   #4
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 138
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 138
Points : 2 466
Points : 2 466
Envoyer un message via Yahoo à zinzineti
Bon tu peux utiliser ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
USE AdventureWorks; -- Mets ici ta base
GO
--Créer la table d'audit T_audit
CREATE TABLE T_audit (Dateheure datetime,DatabaseName nvarchar(100),ObjectName nvarchar(100),LoginName nvarchar(100), Event nvarchar(100), Text_SQL nvarchar(2000));
GO
--Créer le trigger d'audit TR_audit
CREATE TRIGGER TR_audit 
ON DATABASE 
FOR DDL_DATABASE_LEVEL_EVENTS 
AS
DECLARE @DATA XML
SET @DATA = EVENTDATA()
INSERT T_audit 
   (Dateheure,DatabaseName,ObjectName,LoginName,Event,Text_SQL) 
   VALUES 
   (GETDATE(), 
    @DATA.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'nvarchar(100)'),
    @DATA.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(100)'),
    @DATA.value('(/EVENT_INSTANCE/LoginName)[1]', 'nvarchar(100)'), 
    @DATA.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
    @DATA.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') ) ;
GO
--Tester le trigger.
CREATE TABLE TestTable (a int)
GO
DROP TABLE TestTable ;
GO
-- Que dit la table d'audit ?
SELECT * FROM T_audit ;
GO
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 15h10   #5
Membre à l'essai
 
Inscription : juillet 2008
Messages : 92
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 92
Points : 21
Points : 21
Merci, c'est pas mal mais je ne peux pas tracer les évènements "SELECT" d'une table et c'est précisément ceci qui m'intéresse.
On ne peut pas auditer les select?

Merci
mad_martigan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 15h15   #6
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 138
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 138
Points : 2 466
Points : 2 466
Envoyer un message via Yahoo à zinzineti
Pour auditer uniquement les SELECT portant sur une table en particulier :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
--Créer la table d'audit T_audit
CREATE TABLE T_audit (creation_time datetime,last_execution_time datetime,execution_count int, Text_SQL nvarchar(4000));
GO
 
-- Créer la procédure stockée d'audit 
CREATE PROCEDURE P_Audit_SELECT
@TableName sysname
AS
INSERT INTO T_audit (creation_time,last_execution_time,execution_count,Text_SQL)
SELECT  creation_time,
last_execution_time,
execution_count,
text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
WHERE st.text LIKE '%SELECT%' + @TableName + '%';
Tu peux planifier l'exécution de la procédure stockée :

Code :
1
2
-- Test 
EXEC P_Audit_SELECT N'myTable'
La fouille de la table d'audit
Code :
1
2
3
 
-- Que contient la table d'audit ?
SELECT * FROM T_audit
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 15h31   #7
Membre à l'essai
 
Inscription : juillet 2008
Messages : 92
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 92
Points : 21
Points : 21
Lorsque je lance la partie du SELECT, j'obtiens bien des résultats.

Par contre si je lance le code :

Code :
1
2
 
EXEC P_Audit_SELECT N'myTable'
j'obtiens le message suivant :

"Les données de chaîne ou binaires seront tronquées."

Ok, j'imagine que la colonne text n'a pas la capacité suffisante...

Merci
mad_martigan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 15h39   #8
Membre à l'essai
 
Inscription : juillet 2008
Messages : 92
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 92
Points : 21
Points : 21
Je voudrais également savoir qui a lancé la requête, c'est possible?
mad_martigan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 15h46   #9
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 138
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 138
Points : 2 466
Points : 2 466
Envoyer un message via Yahoo à zinzineti
As-tu tenté de remplacer Text_SQL nvarchar(4000) par

Text_SQL nvarchar(max)

Pour avoir

Code :
1
2
CREATE TABLE T_audit (creation_time datetime,last_execution_time datetime,execution_count int, Text_SQL nvarchar(max));
GO
?
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 15h56   #10
Membre à l'essai
 
Inscription : juillet 2008
Messages : 92
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 92
Points : 21
Points : 21
Effectivement ça fonctionne, il ne me reste plus qu'à stocker le login, c'est faisable?

Merci
mad_martigan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 16h09   #11
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 138
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 138
Points : 2 466
Points : 2 466
Envoyer un message via Yahoo à zinzineti
Citation:
Envoyé par mad_martigan Voir le message
Effectivement ça fonctionne, il ne me reste plus qu'à stocker le login, c'est faisable?

Merci
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 17h38   #12
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 138
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 138
Points : 2 466
Points : 2 466
Envoyer un message via Yahoo à zinzineti
pour obtenir les users ayant exécutés les requêtes SELECT tu peux créer une trace Profiler, l'utiliser pour insérer les infos dans la table T_audit
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 17h46   #13
Membre à l'essai
 
Inscription : juillet 2008
Messages : 92
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 92
Points : 21
Points : 21
Il semble qu'en incluant SUSER_SNAME() je récupère le compte de service de SQL Server...
Pourquoi?
mad_martigan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 23h24   #14
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 138
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 138
Points : 2 466
Points : 2 466
Envoyer un message via Yahoo à zinzineti
Citation:
Envoyé par mad_martigan Voir le message
Il semble qu'en incluant SUSER_SNAME() je récupère le compte de service de SQL Server...
Pourquoi?
SUSER_SNAME() indique le l'utilisateur (le compte) qui exécute la procédure stockée. Ce qui n'est pas ton besoin...

Comme je l'ai dit plus haut, si tu veux aussi l'utilisateur qui a exécuté la requête SELECT, il faut plutôt créer une trace Profiler pour alimenter la table T_audit.
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h14.


 
 
 
 
Partenaires

Hébergement Web