IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Qui a dropper la table


Sujet :

MS SQL Server

  1. #1
    Membre éclairé Avatar de bilb0t
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    378
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 378
    Par défaut Qui a dropper la table
    Bonjour,

    j'ai une table qui a disparu sur un server de test.

    Et évidemment c'est personne... Come les gens m'ont l'air sincère, je me demande s'il n'y a pas un gugusse qui a créer un code quelque part qui risque de dropper des tables quand on publiera...

    Bref, y a-t-il un moyen de savoir qui a dropper une table et quand ?

    merci

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Par défaut
    Si le code malicieux est dans une procedure stockée, tu fais une generation du script de toutes tes procédures et tu recherches le mot DROP.

    Si le code malicieux se trouve dans votre code, vous procéder de la même manière avec visual studio.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    qui, quand, difficile à postériori....
    A priori vous pouvez mettre en place ce genre d'audit à l'aide de triggers DDL.
    A postériori certains éditeurs vendent des outils de lecture du JT (Apex par exemple). Je ne sais pas si cette info, QUI, y figure... En revanche, QUAND vous l'aurez...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre éclairé Avatar de bilb0t
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    378
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 378
    Par défaut
    Bonjour, merci pour vos réponses.

    Est-il possible d'imaginer d'auditer la DB pour loguer les drop table ?

    Si oui, qu'est-ce que ça implique en terme de performances ?

    merci

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Par défaut
    A priori vous pouvez mettre en place ce genre d'audit à l'aide de triggers DDL.
    d'apres ma recherche sur internet, le trigger DDL est une fonctionnalité sql serveur 2005.

    reference : http://www.google.fr/search?sourceid...dl+sql+serveur

    De plus, cela me parait un gros travail de développement pour une information qui présente peu d'intérêt.

    Mieux vaut chercher le code malicieux une bonne fois pour toute et oubliez le problème une fois résolu, non ?

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Si vous êtes sous SQL Server 2005, vous pouvez effectivement créer un trigger DDL, comme par exemple celui-ci (doc)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    USE MASTER;
    GO
     
    -- Crée la table de log
    CREATE TABLE MASTER.dbo.SchemaModification
    (
    	Date DATETIME NOT NULL,
    	Utilisateur VARCHAR(128) NOT NULL,
    	Objet VARCHAR(1024) NOT NULL,
    	Commande TEXT
    )
    GO
     
    USE ELSUKET;
    GO
     
    -- Crée le trigger DDL qui logguera dans MASTER.dbo.SchemaModification
    CREATE TRIGGER DDL_TRIGGER
    	ON DATABASE
    FOR DDL_VIEW_EVENTS, DDL_INDEX_EVENTS, DDL_TABLE_EVENTS,
    	DROP_PROCEDURE, CREATE_PROCEDURE, ALTER_PROCEDURE,
    	DROP_TRIGGER, CREATE_TRIGGER, ALTER_TRIGGER
    AS 
    BEGIN
    	SET NOCOUNT ON;
     
    	DECLARE @EventData XML;
    	DECLARE @SQL_Statement VARCHAR(MAX);
    	SET @EventData = EventData();
     
    	SELECT @SQL_Statement = @EventData.value('data(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'VARCHAR(MAX)');
    	INSERT MASTER.dbo.ShemaModification
    		SELECT GETDATE(),
    				@EventData.value('data(/EVENT_INSTANCE/LoginName)[1]', 'VARCHAR(128)'),
    				@EventData.value('data(/EVENT_INSTANCE/ObjectName)[1]', 'VARCHAR(1024)'),
    				@SQL_Statement;
     
    	SET NOCOUNT OFF;
    END;
    GO
    ENABLE TRIGGER DDL_TRIGGER ON DATABASE
    GO
    Vous pouvez aussi créer un job de trace des actions utilisateur. Cela consomme peu de ressources, mais présente deux désavantages:

    - Logguer dans un fichier et non pas dans une table. Vous pouvez néanmoins remonter le ficher de trace dans une table en base de données à l'aide de l'utilitaire SQL Server Profiler
    - 1 utilisateur = 1 appel à sp_trace_setfilter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    CREATE PROCEDURE [dbo].[spJOB_MONITOR_USER_COMMANDS]
    AS
    BEGIN
    	DECLARE @rc INT;
    	DECLARE @TraceID INT;
     
    	-- Calcule le nom du fciher de trace
    	DECLARE @filename NVARCHAR(245);
    	SELECT @filename = '[LECTEUR]:\RepertoireDeTraces\' + DB_NAME() + '_' +
    			CONVERT(VARCHAR, DATEPART(year, GETDATE())) + '_' + 
    			CASE LEN(CONVERT(VARCHAR, DATEPART(month, GETDATE())))
    				WHEN 1 THEN '0' + CONVERT(VARCHAR, DATEPART(month, GETDATE()))
    				ELSE CONVERT(VARCHAR, DATEPART(month, GETDATE()))
    			END + '_' +
    			CONVERT(VARCHAR, DATEPART(day, GETDATE())) + '_' +
    			CONVERT(VARCHAR, DATEPART(hour, GETDATE())) + 'H' +
    			CONVERT(VARCHAR, DATEPART(minute, GETDATE())) + 'min' +
    			CONVERT(VARCHAR, DATEPART(second, GETDATE())) + 's';
     
    	DECLARE @STOP_TIME DATETIME;
    	SELECT @STOP_TIME = DATEADD(Hour, 12, GETDATE());
     
    	DECLARE @trace_file_size BIGINT; SET @trace_file_size = 50;
     
    	-- Crée le fichier de trace
    	-- sp_trace_create @traceid OUTPUT, @options, @trace_file, @maxfilesize, @stoptime, @filecount
    	EXEC @rc = sp_trace_create @TraceID OUTPUT, 6, @filename, @trace_file_size, @STOP_TIME, NULL 
    	DECLARE @ERR VARCHAR(128);
    	SELECT @ERR = CASE @rc
    					WHEN 0 THEN 'sp_trace_create: created TRACEID ' + CONVERT(VARCHAR, @TraceID)
    					WHEN 1 THEN 'sp_trace_create: UNKNOWN ERROR'
    					WHEN 10 THEN 'sp_trace_create: INVALID OPTIONS'
    					WHEN 12 THEN 'sp_trace_create: FILE NOT CREATED'
    					WHEN 13 THEN 'sp_trace_create: OUT OF MEMORY'
    					WHEN 14 THEN 'sp_trace_create: INVALID STOP TIME'
    					WHEN 15 THEN  'sp_trace_create: INVALID PARAMETERS'
    				END;
    	-- Mettez ici le traitement de @rc : vous pouvez par exemple vous envoyer un e-mail lorsque la trace vient d'être créée,
    	-- à l'aide de la procédure msdb.dbo.sp_send_db_mail
     
    	DECLARE @on BIT; SET @on = 1;
     
    	EXEC sp_trace_setevent @TraceID, 13, 12, @on; -- Event : SQL:BatchStarting, SPID column (Mandatory)
    	EXEC sp_trace_setevent @TraceID, 13, 64, @on; -- Event : SQL:BatchStarting, SessionLoginName 
    	EXEC sp_trace_setevent @TraceID, 13, 1, @on; -- Event : SQL:BatchStarting, TextData 
    	EXEC sp_trace_setevent @TraceID, 13, 14, @on; -- Event : SQL:BatchStarting, StartTime 
    	EXEC sp_trace_setevent @TraceID, 13, 35, @on; -- Event : SQL:BatchStarting, DatabaseName 
     
    	-- Ajout des filtres
    	/*
    	 sp_trace_setfilter myTrace,
    						myColumn (64 = SessionLoginName), 
    						myLogicalOperator (AND : 0, OR : 1),
    						myComparisonOperator (6 = LIKE),
    						myComparisonValue
    	*/
    	EXEC sp_trace_setfilter @TraceID, 64, 1, 6, N'nomDeLogin'
     
    	-- Démarrage de la trace
    	EXEC sp_trace_setstatus @TraceID, 1;
    END;
    GO
    Dans cet exemple j'ai mis 12 heures pour mon fichier de trace, mais c'est à vous de le paramétrer en fonction du nombre de personnes qui travaillent sur votre BD et du nombre d'opérations qu'ils effectuent. Vous pouvez exécuter cette procédure stockée par un job qui démarre toutes les 12 heures, si vous suivez mon exemple

    Je vous laisse le soin de traiter la suppression des fichiers de trace

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/04/2006, 08h53
  2. Utiliser les options qui sont dans ma table
    Par valery17 dans le forum Access
    Réponses: 1
    Dernier message: 21/04/2006, 22h45
  3. Réponses: 2
    Dernier message: 16/02/2006, 23h09
  4. Requete MySql qui bloque. Probleme de table?
    Par Doberman dans le forum Requêtes
    Réponses: 4
    Dernier message: 06/02/2006, 20h28
  5. dropper une table référencée
    Par zais_ethael dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 02/11/2005, 21h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo