#!/usr/bin/perl -w use DBI; use Pod::Text; use CGI; use strict; ######################################################################### ####### VARIABLES GLOBALES ######### ######################################################################### my $script = 'change_postgresql_rights.pl'; ######################################################################### #oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo# #oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo# #oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo# =pod =head1 change_postgresql_rights.pl ################################################################# # CVS # ################################################################# # # #$Id: change_postgresql_rights.pl,v 1.2 2006/08/22 15:44:19 devcrgs Exp $ # # # #$Author: devcrgs $ # # # #$Date: 2006/08/22 15:44:19 $ # # # #$Revision: 1.2 $ # # # ################################################################# =over 4 =item DESCRIPTION programme qui prend en entrée l'action à appliquer aux privilèges du compte 3700user sur les tables des bases de données -> tout en lecture -> tout en modif =item BIBLIOTHEQUES et PACKAGE Perl::DBI -> Drivers de Connection Perl-Base de données ________________________________________________________________________ =back =cut #oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo# #oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo# #oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo# ######################################################################### ####### MAIN ######### ######################################################################### =pod =over 4 =head2 MAIN =item 1. DESCRIPTION recupère en entrée l'argument permettant de savoir s'il faut passer le compte utilisateur en lecture ou en modification sur toutes les tables pour chaque base de données dont l'accès est à modifier lance la connection à la base de donnees, recupère la liste des tables de la base pour chaque table met le bon statut pour l'utilisateur ferme la connection à la base de données ________________________________________________________________________ =back =cut MAIN: { #compte postgresql dont les privilèges sont à modifier my $pgsqlUser = '3700user'; #serveur de base de données our $dbhost = 'localhost'; #nom des bases de données dont l'accès est à restreindre our @BDDs = ('BDD1','BDD2','BDD3'); my $dbh; #identifiants du compte propriétaire des tables pour pouvoir modifier les privilèges des autres utilisateurs qui accèdent aux bases de données my $user_name = 'utilisateur'; my $password = 'mot2passe'; my $message = ''; #création d'un objet CGI pour la gestion des formulaires our $query = new CGI; print $query->header(-lang=>'fr-FR'); print $query->start_html( -title=>'Modification du statut du compte '. $pgsqlUser .' sur les bases postgresql', -author=>'gerald2545@hotmail.com', -base=>'true', -meta=>{'keywords'=>'SQL, lecture, modification','copyright'=>'copyright 2006 CRGS'}, -style=>{'src'=>'./style.css'}, ); #description de l'utilisation de cette page web print <
  • Le passage en lecture seule implique que les données des bases pourront être consultées par les différentes interfaces clientes mais non modifiées. Cela peut servir lors de la migration des bases pour qu'elles restent dans un état cohérent durant leur transfert.
  • Pour passer les bases en lecture seule, sélectionner le bouton radio "lecture", et pour les remettre en mode modification, sélectionner le bouton radio "modification".
    Attention : si vous mettez les bases en lecture seule, vous ne pourrez plus insérer de données, ni modifier les données déjà enregistrées. Veuillez prévenir vos utilisateurs préalablement.
PLK PrintAccueil(); print qq |
|; if ($query -> param('execute_action') ne undef) { my $status = $query -> param('status'); my $BDD; my $message; print "Vous désirez appliquer le mode $status aux bases de données :
"; foreach $BDD (@BDDs) { #connexion à BDD $dbh = DBI -> connect ("DBI:Pg:dbname=$BDD;host=$dbhost;port=5432",$user_name,$password,{RaiseError=>1,PrintError => 0,AutoCommit => 0}) || die ("Echec de connection à $BDD :\n".DBI::errstr); #récupération des tables de la base connectée my $requete_tables = "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_name NOT LIKE 'pga%' AND table_type = 'BASE TABLE'"; my $tables; eval{ $tables = $dbh->selectall_arrayref($requete_tables); }; if ($@) { print "Il y a eu un problème lors de la sélection des tables de la base de données $BDD."; die; } my $sql = ''; my $ErrorMessage = ''; #si la base de données contient des tables if ($#$tables > -1) { my $table; #pour chaque table on crée les requête de mise à jour des privilèges if ($status eq 'lecture') { for $table (@$tables) { $sql .= 'REVOKE ALL ON TABLE '.$$table[0].' FROM "'.$pgsqlUser.'";'; $sql .= 'GRANT SELECT ON TABLE '.$$table[0].' TO "'.$pgsqlUser.'";'; }#1 } else { for $table (@$tables) { $sql .= 'REVOKE ALL ON TABLE '.$$table[0].' FROM "'.$pgsqlUser.'";'; $sql .= 'GRANT INSERT,SELECT,UPDATE,DELETE ON TABLE '.$$table[0].' TO "'.$pgsqlUser.'";'; }#1 } #exécute les commandes de modification de privilèges eval{ $dbh->do($sql); $dbh -> commit(); }; if ($@) { $dbh -> rollback(); $ErrorMessage .= 'Il y a eu un problème lors de la modification du statut pour passer en mode '.$status.' sur la base '.$BDD.' : '. $@; } #résultat de l'opération réussie ou non if ($ErrorMessage eq undef) { print "Changement du statut effectué pour la base $BDD. Veuillez tout de même vérifier par vous même en faisant des modifs sur cette base."; $message .= "Changement du statut effectué pour la base $BDD. Veuillez tout de même vérifier par vous même en faisant des modifs sur cette base."; } else { print $ErrorMessage; $message .= "Il y a eu un problème lors de la modification du statut pour passer en mode $status sur la base $BDD : $ErrorMessage"; } } else { print "La base de données $BDD ne contient pas de tables."; } #deconnexion de la base de données $dbh -> disconnect() || CgiDie (DBI::errstr); } } print ""; print $query->end_html(); } #oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo# #oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo# #oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo# ############################################################### ##### PAGE D'ACCUEIL ####### ############################################################### =pod =head2 sub PrintAccueil () =over 4 =item 1. DESCRIPTION Affiche un formulaire web avec deux boutons radios ________________________________________________________________________ =back =cut sub PrintAccueil() { our $query; our @BDDs; our $dbhost; print $query->start_multipart_form( -method=>"POST", -action=>"$script", -name=>"modify_status", ); print qq |Statut à appliquer aux bases de données (|; print join (',',@BDDs) . ') sur le serveur '.$dbhost.' :
'; print $query->radio_group( -name=>'status', -values=>['lecture','modification'], -default=>'lecture', -linebreak=>'false', ); print $query->submit( -name=>'execute_action', -value=>'Appliquer aux bases de données', ); print $query->endform(); }