Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
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 05/07/2006, 16h25   #1
Membre du Club
 
Homme
Développeur .NET
Inscription : octobre 2002
Messages : 178
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : Suisse

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

Informations forums :
Inscription : octobre 2002
Messages : 178
Points : 48
Points : 48
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 :
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 :
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 :
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 :
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 :
CREATE OR REPLACE FUNCTION ma_fonction() RETURNS TRIGGER AS $je_sais_pas_quoi$

Je vous remercie d'avance
Bindy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2006, 00h15   #2
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
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
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2006, 08h23   #3
Membre du Club
 
Homme
Développeur .NET
Inscription : octobre 2002
Messages : 178
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : Suisse

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

Informations forums :
Inscription : octobre 2002
Messages : 178
Points : 48
Points : 48
d'accord, merci beaucoup pour ces précisions!
Bindy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2006, 09h24   #4
Membre du Club
 
Homme
Développeur .NET
Inscription : octobre 2002
Messages : 178
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : Suisse

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

Informations forums :
Inscription : octobre 2002
Messages : 178
Points : 48
Points : 48
Citation:
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"
Bindy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2006, 22h42   #5
Membre émérite
 
Avatar de hpalpha
 
Inscription : mars 2002
Messages : 770
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 770
Points : 833
Points : 833
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
hpalpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 09h07   #6
Membre du Club
 
Homme
Développeur .NET
Inscription : octobre 2002
Messages : 178
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : Suisse

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

Informations forums :
Inscription : octobre 2002
Messages : 178
Points : 48
Points : 48
oui merci,

mais est-ce que "dblink" est aussi possible pour les Insert, ou c'est juste les SELECT ???
Bindy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2006, 16h58   #7
Membre du Club
 
Homme
Développeur .NET
Inscription : octobre 2002
Messages : 178
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : Suisse

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

Informations forums :
Inscription : octobre 2002
Messages : 178
Points : 48
Points : 48
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 :
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 :
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();
Bindy 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 21h29.


 
 
 
 
Partenaires

Hébergement Web