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

PostgreSQL Discussion :

[trigger] recopier les enregistrements d'une table d'une BD à une autre BD


Sujet :

PostgreSQL

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2002
    Messages : 177
    Points : 81
    Points
    81
    Par défaut [trigger] recopier les enregistrements d'une table d'une BD à une autre BD
    Bonjour,

    Je tourne sous Windows avec la version PostgreSQL 8.1.3.

    J'explique mon problème

    J'ai 2 bases de données situés sur le même serveur, qui contiennent chacune 1 table.

    1 BDD bd_original avec une table "test" avec 1 champ "nom" de type varchar rien d'autres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE test
    (
      nom varchar
    )
    1 BDD bd_sauvegarde avec une table "test_sauvegarde" avec 1 champ "nom_sauvegarde" de type varchar et un autre champ "date_sauvegarde" de type "TIMESTAMP".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE test_sauvegarde
    (
      nom_sauvegarde varchar,
      date_sauvegarde timestamp
    )
    Je souhaite que lorsque j'ajoute un enregistrement dans "bd_original->table test", cet enregistrement soit recopié dans la base "bd_sauvegarde->table test_sauvegarde" grâce à un trigger.

    La création du trigger ne m'a pas posé trop de problèmes, mais dans le cas où les 2 tables se trouvent sur la même base de données

    Voici ma fonction et mon trigger pour "recopier des enregistrements d'une table à l'autre" avec les tables sur la même BD

    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
    --Fonction exemple
     
    CREATE OR REPLACE FUNCTION ma_fonction() RETURNS TRIGGER AS $je_sais_pas_quoi$
    BEGIN 
    INSERT INTO test_sauvegarde(
    test_sauvegarde,
    date_sauvegarde)
     
    VALUES (
    NEW.test, 
    CURRENT_TIMESTAMP);
     
    RETURN NULL;
    END;
    $je_sais_pas_quoi$ LANGUAGE plpgsql;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    -- Trigger qui reprend la fonction
    CREATE TRIGGER mon_trigger
    AFTER INSERT ON test
    FOR EACH ROW EXECUTE PROCEDURE ma_fonction();
    Comment cela se passe-t-il si les 2 tables sont sur des bases de données différentes ? Est-ce qu'il faut se connecter à l'autre BD ? Comment ?

    J'aimerais savoir cela pour me permettre "d'enregistrer les mouvements des utilisateurs" et je désire faire 2 bases de données pour une raison de sécurité...

    encore une chose à propos de ma fonction, quelqu'une pourrait me dire à quoi sert la chaîne de caractères après AS, ce qui est entre $ ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE OR REPLACE FUNCTION ma_fonction() RETURNS TRIGGER AS $je_sais_pas_quoi$

    Je vous remercie d'avance

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonsoir,

    Citation Envoyé par Bindy
    Comment cela se passe-t-il si les 2 tables sont sur des bases de données différentes ? Est-ce qu'il faut se connecter à l'autre BD ? Comment ?
    Pour l'instant PostgreSQL ne permet pas les requêtes interbases. Généralement, on simule ce fonctionnement en ne créant qu'une seule base de données et en la divisant en schémas, qui servent d'espace de noms et auxquels on donne des droits d'accès à des utilisateurs différents.
    Citation Envoyé par Bindy
    encore une chose à propos de ma fonction, quelqu'une pourrait me dire à quoi sert la chaîne de caractères après AS, ce qui est entre $ ?
    Cela sert de marqueur de début et de fin du corps de la fonction. Généralement, on utilise BODY comme chaîne de caractères...
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2002
    Messages : 177
    Points : 81
    Points
    81
    Par défaut
    d'accord, merci beaucoup pour ces précisions!

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2002
    Messages : 177
    Points : 81
    Points
    81
    Par défaut
    Pour l'instant PostgreSQL ne permet pas les requêtes interbases. Généralement, on simule ce fonctionnement en ne créant qu'une seule base de données et en la divisant en schémas, qui servent d'espace de noms et auxquels on donne des droits d'accès à des utilisateurs différents.
    Y'a-t-il un moyen de se "connecter" en langage SQL à un schéma personnalisé, et éviter ainsi de préfixer tous les noms des tables d'un "mon_schema".ma_table ???

    parce que s'ils l'ont ne précise rien, les tables se crée dans le schéma "public"

  5. #5
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    Bonsoir,

    j'avais deja expliqué dans un thread qu'il etait possible de faire du cross database :
    voici le lien
    http://www.developpez.net/forums/sho...d.php?t=7562#7

    j'espere que ca t'aidera
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2002
    Messages : 177
    Points : 81
    Points
    81
    Par défaut
    oui merci,

    mais est-ce que "dblink" est aussi possible pour les Insert, ou c'est juste les SELECT ???

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2002
    Messages : 177
    Points : 81
    Points
    81
    Par défaut
    Alors, voilà comment j'ai fait pour "sauvegarder" les tables du schéma "public" dans un schéma perso("schema_sauvegarde") pour ceux que ça intéresse

    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
     
    --Fonction qui ajoute ou modifie les données dans une table de sauvegarde du schéma "schema_sauvegarde" 
    --lors d'un INSERT ou UPDATE
     
    CREATE OR REPLACE FUNCTION fonction_insert_tb_x_sauv() RETURNS TRIGGER AS $corps_fonction$
    --déclaration d'une variable text
    DECLARE action_effectuee text;
     
    BEGIN 
    --initialisation de la variable, elle aura pour valeur l'opération effectuée sur la table (TG_OP), INSERT, UPDATE ou DELETE
    action_effectuee := TG_OP;
     
    --si c'est 1 INSERT, alors on ajoute dans la table sauvegarde
    IF action_effectuee = 'INSERT' THEN
    	INSERT INTO schema_sauvegarde.tb_x_sauv(
    	id_sauv,
    	nom_sauv,
    	date_sauv)
     
    --on reprend les valeurs de la table auquelle on ajoute
    	VALUES (
    	NEW.id, 
    	NEW.nom,
    --on ajoute également l'heure et la date de l'insert 
    	CURRENT_TIMESTAMP);
     
     
     
    -- si c'est 1 UPDATE alors on modifie dans la table sauvegarde
    ELSEIF action_effectuee = 'UPDATE' THEN
    	UPDATE schema_sauvegarde.tb_x_sauv
    --on reprend les valeurs de la table auquelle on modifie
    	SET nom_sauv = NEW.nom,
    --on ajoute également l'heure et la date de la modification
    	date_sauv = CURRENT_TIMESTAMP
    --on peut mettre old ou new, ca ne change rien
    	WHERE id_sauv = OLD.id;
     
    END IF;
    -- la fonction ne retourne aucun résultat
    RETURN NULL;
    END;
    $corps_fonction$ LANGUAGE plpgsql;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    -- Trigger qui reprend la fonction 
    CREATE TRIGGER trigger_insert_tb_x_sauv
    --il agira après l'INSERT ou l'UPDATE de la table
    AFTER INSERT OR UPDATE ON tb_x
    --à chaque enregistrement, la fonction sera effectuée
    FOR EACH ROW EXECUTE PROCEDURE fonction_insert_tb_x_sauv();

Discussions similaires

  1. [Modèle Relationnel] Faire une table par type ou une table des types ?
    Par jax54000 dans le forum Schéma
    Réponses: 12
    Dernier message: 18/11/2009, 11h43
  2. [MySQL] Créer une table actuelle à partir d'une table historique
    Par cleminute dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 20/10/2009, 14h35
  3. recupérer les info d'une table X pour alimenter une table Y
    Par lemerite dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 09/09/2008, 11h31
  4. Réponses: 2
    Dernier message: 26/07/2007, 14h27
  5. Réponses: 1
    Dernier message: 12/04/2007, 17h08

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