Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[BRUIT] windev et postgresql

4 réponses
Avatar
Jacques TREPP
Bonjour, et pardon pour le bruit.
je me bagarre avec une concaténation lors de l'exécution d'un trigger
postgresql destiné à auditer les suppressions dans une table.

Voici l'objet :
DROP FUNCTION proc_efface_clients();

CREATE OR REPLACE FUNCTION proc_efface_clients()
RETURNS "trigger" AS
$BODY$

DECLARE

action_effectuee text; -- DELETE
valeur_initiale text; -- Valeur avant modification
valeur_modifiee text; -- Valeur après modification
nom_utilisateur text; -- Utilisateur connecté
table_en_cause text; -- Nom de la table
id integer; -- Valeur temporaire
tab_cli clients%ROWTYPE; -- Valeur temporaire
dt_modif date; -- pour récupérer la date courante
hr_modif time; -- pour récupérer l'heure courante

BEGIN

nom_utilisateur := user;
action_effectuee := TG_OP ;
table_en_cause := TG_RELNAME;
SELECT INTO dt_modif current_date;
SELECT INTO hr_modif substr(current_time,1,8);

-- Pour tracer une variable, utiliser la syntaxe ci-dessous.
-- RAISE NOTICE 'calling proc_delete_clients(%)', variable à tracer;

SELECT INTO id OLD.id_client FROM clients ;
SELECT into tab_cli * FROM clients where id_client = id;

valeur_initiale = 'Identifiant : ' || tab_cli.id_client || '\n '
|| 'code client : ' || tab_cli.codecli || '\n' || 'raison_sociale : '
|| tab_cli.raison_sociale || '\n';


INSERT INTO audit values
(dt_modif, hr_modif, action_effectuee, valeur_initiale, valeur_modifiee,
nom_utilisateur, table_en_cause);
RETURN OLD;

END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION proc_efface_clients() OWNER TO postgres;

-----------------------------
c'est là que ça cloche :
valeur_initiale = 'Identifiant : ' || tab_cli.id_client || '\n '
|| 'code client : ' || tab_cli.codecli || '\n' || 'raison_sociale : '
|| tab_cli.raison_sociale || '\n';
Je voudrais ajouter un retour ligne (\n) à chaque ligne, mais ça ne
fonctionne pas. j'ai testé preque toutes les syntaxes sans succes.

Si Daniel et/ou Frédéric passent par là ...

Merci d'avance, et encore désolé pour le HS.

--
Jacques TREPP
Albygest
3, rue Jean Mermoz
81160 ST-JUERY
(enlevez 'pasdespam' pour me joindre)

4 réponses

Avatar
Firetox
Salut jacques

as tu essayé

valeur_initiale = 'Identifiant : ' || tab_cli.id_client || 'r '
|| 'code client : ' || tab_cli.codecli || 'r' || 'raison_sociale : '
|| tab_cli.raison_sociale || 'r';

ou

valeur_initiale = 'Identifiant : ' || tab_cli.id_client || 'rn '
|| 'code client : ' || tab_cli.codecli || 'rn' || 'raison_sociale : '
|| tab_cli.raison_sociale || 'rn';


a la place

Bon dev
@+

"Jacques TREPP" a écrit dans le message de news:
48354760$0$23851$
Bonjour, et pardon pour le bruit.
je me bagarre avec une concaténation lors de l'exécution d'un trigger
postgresql destiné à auditer les suppressions dans une table.

Voici l'objet :
DROP FUNCTION proc_efface_clients();

CREATE OR REPLACE FUNCTION proc_efface_clients()
RETURNS "trigger" AS
$BODY$

DECLARE

action_effectuee text; -- DELETE
valeur_initiale text; -- Valeur avant modification
valeur_modifiee text; -- Valeur après modification
nom_utilisateur text; -- Utilisateur connecté
table_en_cause text; -- Nom de la table
id integer; -- Valeur temporaire
tab_cli clients%ROWTYPE; -- Valeur temporaire
dt_modif date; -- pour récupérer la date courante
hr_modif time; -- pour récupérer l'heure courante

BEGIN

nom_utilisateur := user;
action_effectuee := TG_OP ;
table_en_cause := TG_RELNAME;
SELECT INTO dt_modif current_date;
SELECT INTO hr_modif substr(current_time,1,8);

-- Pour tracer une variable, utiliser la syntaxe ci-dessous.
-- RAISE NOTICE 'calling proc_delete_clients(%)', variable à tracer;

SELECT INTO id OLD.id_client FROM clients ;
SELECT into tab_cli * FROM clients where id_client = id;

valeur_initiale = 'Identifiant : ' || tab_cli.id_client || 'n '
|| 'code client : ' || tab_cli.codecli || 'n' || 'raison_sociale : '
|| tab_cli.raison_sociale || 'n';


INSERT INTO audit values
(dt_modif, hr_modif, action_effectuee, valeur_initiale, valeur_modifiee,
nom_utilisateur, table_en_cause);
RETURN OLD;

END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION proc_efface_clients() OWNER TO postgres;

-----------------------------
c'est là que ça cloche :
valeur_initiale = 'Identifiant : ' || tab_cli.id_client || 'n '
|| 'code client : ' || tab_cli.codecli || 'n' || 'raison_sociale : '
|| tab_cli.raison_sociale || 'n';
Je voudrais ajouter un retour ligne (n) à chaque ligne, mais ça ne
fonctionne pas. j'ai testé preque toutes les syntaxes sans succes.

Si Daniel et/ou Frédéric passent par là ...

Merci d'avance, et encore désolé pour le HS.

--
Jacques TREPP
Albygest
3, rue Jean Mermoz
81160 ST-JUERY
(enlevez 'pasdespam' pour me joindre)


Avatar
Daniel
Jacques TREPP a écrit :
Bonjour, et pardon pour le bruit.
je me bagarre avec une concaténation lors de l'exécution d'un trigger
postgresql destiné à auditer les suppressions dans une table.

Voici l'objet :
DROP FUNCTION proc_efface_clients();

CREATE OR REPLACE FUNCTION proc_efface_clients()
RETURNS "trigger" AS
$BODY$

DECLARE

action_effectuee text; -- DELETE
valeur_initiale text; -- Valeur avant modification
valeur_modifiee text; -- Valeur après modification
nom_utilisateur text; -- Utilisateur connecté
table_en_cause text; -- Nom de la table
id integer; -- Valeur temporaire
tab_cli clients%ROWTYPE; -- Valeur temporaire
dt_modif date; -- pour récupérer la date courante
hr_modif time; -- pour récupérer l'heure courante

BEGIN

nom_utilisateur := user;
action_effectuee := TG_OP ;
table_en_cause := TG_RELNAME;
SELECT INTO dt_modif current_date;
SELECT INTO hr_modif substr(current_time,1,8);

-- Pour tracer une variable, utiliser la syntaxe ci-dessous.
-- RAISE NOTICE 'calling proc_delete_clients(%)', variable à tracer;

SELECT INTO id OLD.id_client FROM clients ;
SELECT into tab_cli * FROM clients where id_client = id;

valeur_initiale = 'Identifiant : ' || tab_cli.id_client || 'n '
|| 'code client : ' || tab_cli.codecli || 'n' || 'raison_sociale : '
|| tab_cli.raison_sociale || 'n';


INSERT INTO audit values
(dt_modif, hr_modif, action_effectuee, valeur_initiale,
valeur_modifiee, nom_utilisateur, table_en_cause);
RETURN OLD;

END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION proc_efface_clients() OWNER TO postgres;

-----------------------------
c'est là que ça cloche :
valeur_initiale = 'Identifiant : ' || tab_cli.id_client || 'n '
|| 'code client : ' || tab_cli.codecli || 'n' || 'raison_sociale : '
|| tab_cli.raison_sociale || 'n';
Je voudrais ajouter un retour ligne (n) à chaque ligne, mais ça ne
fonctionne pas. j'ai testé preque toutes les syntaxes sans succes.

Si Daniel et/ou Frédéric passent par là ...

Merci d'avance, et encore désolé pour le HS.





Bonjour Jacques,

pas le temps de regarder en détail,mais avant de mettre tout cela en
trigger as tu essayé le code :

SELECT 'Identifiant : ' || tab_cli.id_client || 'n '|| 'code client : '
|| tab_cli.codecli || 'n' || 'raison_sociale : '||
tab_cli.raison_sociale || 'n';


dans un éditeur SQL.

Normalement ton code est bon (au niveau du concat), je ne vois pas trop
l'intérêt du n final dans la suite du code.

Il ne te manquerait pas un : après valeur initiale et le = ?

Pas le temps de regarder en détail le reste du code.

@+
--
suivre ce lien pour répondre:
http://cerbermail.com/?2KrV3YZXnn
Daniel
;-)
Avatar
Jacques TREPP
"Jacques TREPP" a écrit dans le message de
news:48354760$0$23851$

-----------------------------
c'est là que ça cloche :
valeur_initiale = 'Identifiant : ' || tab_cli.id_client || 'n '
|| 'code client : ' || tab_cli.codecli || 'n' || 'raison_sociale : '
|| tab_cli.raison_sociale || 'n';
Je voudrais ajouter un retour ligne (n) à chaque ligne, mais ça ne
fonctionne pas. j'ai testé preque toutes les syntaxes sans succes.



Merci à Daniel et Frédéric qui passaient par là ! :)

En fait, il faut indiquer que c'est une séquence Escape, donc faire :
E'rn'
et ça fonctionne !
Le but étant de conserver les données des enregistrements effacés dans une
table audit de ce format :
CREATE TABLE audit
(
date_modif date,
heure_modif time(8),
action_effectuee varchar,
valeur_initiale varchar,
valeur_finale varchar,
utilisateur varchar,
nom_table varchar
)
WITH OIDS;
Donc on va savoir Qui, Quand et les données de l'enregistrement stockées
dans valeur_initiale dans le cas d'un delete, et dans valeur_initiale et
valeur_finale dans le cas d'un update.

C'est un peu lourd dans le trigger pour les tables avec beaucoup de
colonnes, mais c'est transparent pour l'utilisateur.
De plus, quelle que soit la table, la fenètre audit affichera les données
dans une seule table mémoire, exportable et imprimable.
... j'en suis tout ému ! ;)

--
Jacques TREPP
Albygest
3, rue Jean Mermoz
81160 ST-JUERY
(enlevez 'pasdespam' pour me joindre)
Avatar
Jacques TREPP
Dans la série "En route pour de nouvelles aventures", il serait miraculeux
de pouvoir récupérer les colonnes de manière à construire la variable texte
valeur_initiale et la valeur_finale.
Je vais voir si c'est possible(certainement) et comment(ça j'en sais rien!).

merci encore

--
Jacques TREPP
Albygest
3, rue Jean Mermoz
81160 ST-JUERY
(enlevez 'pasdespam' pour me joindre)