PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 15/12/2009 16:43:36

wilka
Membre

Historique des définitions d'une vue

Bonjour,

Pour éviter les plaintes ou cris d'un développeur qui aurait "dropé" une vue par "erreur" (un drop cascade malheureux d'une table, un mauvais create or replace view et impossible de se rappeler ce qu'on avait avant, une disparition inexpliquée ou la mauvaise foi tout simplement wink ...)
Enfin les raisons peuvent être multiples.
Biensur nous avons toujours une sauvegarde sous la main, mais bon parfois cela ne suffit pas ou peut être une perte de temps pour le dba (surtout en fonction du nombre de dev)...

Donc voila voulant les rendre plus autonome, en cas de problème.
J'ai mis ce petit script en place, qui permet de sauvegarder les modifications de définition d'une vue dans une table à une fréquence donnée (à définir dans le cron pour le lancement du script chez moi il est toute les 10 min sur les serveurs de dev).

1- Creer la table suivante


CREATE TABLE backup_views
(
  backup_date timestamp with time zone,
  base text,  
  table_schema text,
  table_name text,
  view_definition text,
  create_script text
);

2- Creer un fichier batch backupview.sh sur le serveur
contenant le code suivant

#!/bin/bash

psql -U postgres -c "insert into backup_views 
select current_timestamp as backup_date,n.table_catalog as base,n.table_schema::text,n.table_name::text,n.view_definition::text ,
'CREATE OR REPLACE VIEW '||n.table_schema||'.'||n.table_name||' as '||n.view_definition||';'::text as create_script
from information_schema.views n where n.table_schema not in ('information_schema','pg_catalog')
and  (n.table_catalog,n.table_schema,n.table_name,n.view_definition) not in
(select base,table_schema,table_name,view_definition from backup_views where (backup_date,base,table_schema,table_name) in
(select max(backup_date),base,table_schema,table_name from backup_views group by base,table_schema,table_name));" infoctr > /dev/null

(infoctr est le nom de la base, à remplacer par la votre)


Reste à le planifier dans le cron du serveur


Au premier lancement toutes les definitions de vues seront sauvegardées dans la table backup_views, ensuite seulement les nouvelles vues ou vues modifiées seront ajoutées.
(Remarque: juste la definition de la vue est sauvegardée, il n'y a pas les ACL dans cette version)

Voila si ce petit retour peut servir ou augmenter l'esperance de vie des developpeurs.

PS: Je ne sais pas si je suis dans la bonne rubrique, c'est plus un retour d'experience, astuce, enin bon...

Hors ligne

Pied de page des forums