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

Développement SQL Server Discussion :

Archiver des tables à l'aide d'une procédure stockée


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 18
    Points : 8
    Points
    8
    Par défaut Archiver des tables à l'aide d'une procédure stockée
    Bonjour tout le monde,

    Actuellement j'ai une base de données qui contient un 60aines de tables et je dois enregistrer les données de certaines tables.

    Pour cela, je voudrai faire une procédure stockée qui, lorsqu'elle sera exécutée, enregistrera les données de certaines tables (choisies) qui seront présentes depuis plus de deux mois. Ces enregistrements iront dans une nouvelle base de données nommée "Archive".

    Je pense que la méthode que j'ai choisi correspond bien à ce que je désire faire mais actuellement, je n'ai jamais fait de procédure stockée et je ne sais pas trop par quoi commencer.

    Avez-vous des conseils à me donner sur ce sujet ?
    De l'aide à m'apporter ?

    Cordialement,

    Alichoupi

  2. #2
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Jetez un oeil par ici pour la création de votre procédure

    Vous pouvez télécharger la documentation de SQL Server à partir des liens dans ma signature

    Elle pourrait ressembler à:

    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
    CREATE PROCEDURE PsArchivage
    AS
    BEGIN
    	-- Calcule la date d'aujourd'hui (GETDATE()) moins deux mois
    	DECLARE @dateArchivage DATETIME
    	SELECT @dateArchivage = DATEADD(month, -2, CAST(CONVERT(CHAR(8), GETDATE(), 112) AS DATETIME))
     
    	-- Copie les données dans la base de données d'archivage
    	INSERT INTO maBDArchivage.dbo.maTableArchivage
    	SELECT mesColonnes
    	FROM maBD.dbo.maTable
    	WHERE uneColonneDate < @dateArchivage
     
    	-- Supprime les données de la table source
    	DELETE FROM maBD.dbo.maTable
    	WHERE uneColonneDate < @dateArchivage
    END
    @++

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Merci pour votre réponse, je vais partir là dessus je pense.

    Cependant j'ai une petite question, quelle est la syntaxe pour vérifier si une table est présente ou pas dans une base de données ?

    Je voudrais faire un test :
    Si la table n'existe pas dans la base alors
    CREATE TABLE ...

    Je ne trouve pas

    -------------

    Et pouvez vous m'expliquer brièvement ce que vous faites ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DATEADD(month, -2, CAST(CONVERT(CHAR(8), GETDATE(), 112) AS DATETIME))
    Je comprend quelques trucs mais pas tout. Comme par exemple le 112.

    Normalement, si j'ai bien compris, une date comme celle ci :
    2009-01-30 09:48:19.297
    Devrait être insérée non ?

  4. #4
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Cependant j'ai une petite question, quelle est la syntaxe pour vérifier si une table est présente ou pas dans une base de données ?

    Je voudrais faire un test :
    Si la table n'existe pas dans la base alors
    CREATE TABLE ...
    La requête à la norme serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    IF NOT EXISTS
    (
    	SELECT *
    	FROM INFORMATION_SCHEMA.TABLES
    	WHERE TABLE_NAME = 'maTable'
    )
    BEGIN
    	CREATE TABLE maTable
    	(
    		mesColonnes monType
    	)
    END
    mais vous pouvez aussi écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    IF NOT EXISTS
    (
    	SELECT *
    	FROM sys.tables
    	WHERE name = 'maTable'
    )
    BEGIN
    	CREATE TABLE maTable
    	(
    		mesColonnes monType
    	)
    END
    Sachez que vous pouvez créer une table sans vous échiner à en récupérer les colonnes, avec la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TOP 0 *
    INTO BDArchivage.dbo.maTable
    FROM BDSource.dbo.maTable
    que vous pouvez placer entre le BEGIN et le END à la place de la requête CREATE TABLE.

    En ce qui concerne la manipulation de la date du jour :

    - GETDATE() retourne la date courante

    - CONVERT(CHAR(8), uneDate, 112) retourne une date formatée au format ISO (112), c'est à dire au format AAAAMMJJ

    - CAST transtype une donnée dans un autre type de données, en l'occurrence la chaîne 20090527 en date (donc avec l'heure, et comme il n'y en a pas, les heures, minutes et secondes de cette date sont à 0.

    Normalement, si j'ai bien compris, une date comme celle ci :
    2009-01-30 09:48:19.297
    Ceci n'est pas une date, c'est une des représentations possibles d'une date sous SQL Server (voyez les nombreux formats que propose la fonction CONVERT).
    Sachez que les valeurs dates de type DATETIME sont stockées sous la forme de deux entiers de 4 octets, un pour la date et l'autre pour l'heure.

    Il vous reste à jouer votre procédure stockée régulièrement dans un job

    @++

  5. #5
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonsoir,

    Attention à effectuer ce traitement dans une transaction explicite.

    Une autre technique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    -- Copie les données dans la base de données d'archivage
    INSERT INTO maBDArchivage.dbo.maTableArchivage
    SELECT src.mesColonnes
    FROM maBD.dbo.maTable src
    WHERE src.MaPk NOT IN
    (SELECT dst.MaPk  FROM maBDArchivage.dbo.maTableArchivage dst)
    AND ...
     
    -- Supprime les données archivées de la table source
    DELETE FROM maBD.dbo.maTable
    WHERE maTable.maPk IN
    (SELECT dst.MaPk  FROM maBDArchivage.dbo.maTableArchivage dst)

    @+

  6. #6
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Merci bien pour vos explications

    J'arrive à m'en sortir pour le moment

    Une petite question, il est possible de mettre une variable comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DECLARE @Longueur SMALLINT
    DECLARE @Unite VARCHAR(5)
    SELECT @Unite = 'month'
    SELECT @Longueur = -2
    SELECT @dateArchivage = DATEADD(@Unite, @Longueur, CAST(CONVERT(CHAR(8), GETDATE(), 112) AS DATETIME))
    SQL Server me dit que le paramètre @Unite n'est pas valide ...

  7. #7
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonjour,

    Le premier argument de DATEADD() n'est pas une chaîne de caractère. il faut utiliser directement month.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT @dateArchivage = DATEADD(month, @Longueur, CAST(CONVERT(CHAR(8), GETDATE(), 112) AS DATETIME))
    @+

  8. #8
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    On peut également utiliser week ou Year ...

    C'est pour ça que je voulais utiliser une variable, c'est plus facile à changer par la suite.

    C'est donc impossible ?

  9. #9
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonjour,

    Dans ce cas vous vouvez utiliser le plus petit interval envisageable, par exemple day et multiplier @longueur -> 7, 30, 365 ... en arrondissant largement, mais cela importe t'il ?

    @+

  10. #10
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    En fait j'ai ajouté deux champs dans la base de données permettant de choisir "month" ou "week" ainsi que la durée.
    Comme ça l'utilisateur à juste à modifier ces valeurs.

    Donc moi dans ma procédure, je voulais juste récupérer ces valeurs. J'pensais qu'une simple variable changerait ...

  11. #11
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Tout ce qui est variable en SQL doit être préfixé par @
    Si vous regardez la spécification de la fonction DATEADD, vous verrez que vous ne pouvez passer le premier paramètre comme une variable (d'autres fonctions T-SQL l'autorisent )

    Pour reprendre la suppression de données que vous a proposé agemis31, vous pouvez aussi utiliser un prédicat de jointure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    -- Supprime les données archivées de la table source
    DELETE FROM maBD.dbo.maTable
    FROM dbo.maTable AS SOURCE.maPk IN
    INNER JOIN maBDArchivage.dbo.maTableArchivage AS DEST ON SOURCE.maPK = DEST.maPK
    @++

  12. #12
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    J'ai déjà regardais la spécification de la fonction DATEADD mais je n'ai pas vu que l'on ne pouvait pas utiliser une variable sur le premier paramètre ...

    Dans ce cas là, si ce n'est pas possible, je vais faire autrement lol

    Pour la suppression, je vous avoue que je ne m'y suis pas encore penché mais ça devrait ne pas tarder

    Edit : C'est bon pour la suppression, j'l'ai mis en place. Merci pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. MAJ d'une table à l'aide d'une procédure stockée
    Par ghilo dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 03/08/2009, 13h29
  2. Récupérer des valeurs à l'aide d'une procédure stockée
    Par Contact2012 dans le forum Développement
    Réponses: 7
    Dernier message: 02/09/2008, 15h02
  3. Réponses: 1
    Dernier message: 24/04/2008, 15h23
  4. Aide pour une procédure stockée
    Par shirya dans le forum Langage SQL
    Réponses: 1
    Dernier message: 02/03/2007, 08h48
  5. Aide sur une Procédure stockée
    Par NicoNGRI dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/12/2006, 00h48

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