Le script ci dessous produit une classe sign qui permet de calculer une clef de chaque table de’une bd Oracle.
méthode |
description |
sign() | créer une instance de la classe |
connect() | se connecte au serveur de données (ms SQL server) |
rowscnTable() | calcul la clef de la table passée en paramètre |
rowscnTables() | calcule la clef de toutes les tables de la bd |
save() | enregistre le résultat du calcul dans un fichier |
#-*-coding:utf-8-*- import cx_Oracle import Tkinter, tkFileDialog # pour save import datetime class sign(dict): def __init__(self): pass def connect(self,srv,usr,pwd,service): """connexion à un serveur ms sql server""" self.service=service self.usr=usr self.cnx= cx_Oracle.connect('%s/%s@%s/%s' % (usr,pwd,srv,service)) def tables(self): """liste des tables """ rq="SELECT * FROM user_tables" crs=self.cnx.cursor() crs.execute(rq) ds=crs.fetchall() crs.close() T=[] for dr in ds: T.append(dr[0]) return T def sqlGetValue(self, requete): """retourne une valeur scalaire d'une requete sql""" crs=self.cnx.cursor() crs.execute(requete) dr=crs.fetchone() R=dr[0] crs.close() return R def rowscnTable(self,tableName): """ Objet calcul la clef de la table passée en param """ rq="SELECT max(ora_rowscn) from %s" % tableName R= self.sqlGetValue(rq) if not R: R=0 return R def rowscnTables(self): """calcul la clef de toutes les tables de la bd""" self.clear() for t in self.tables(): self[t]=self.rowscnTable(t) def close(self): self.cnx.close() def save(self, fichier=None): """Sauvegarde des clefs calculées dans un fichier""" if not fichier: strdate=datetime.datetime.today().strftime('%Y-%m-%d_%Hh%M') model= 'keys.tables.%s.%s.%s.txt'%(self.usr,self.service,strdate) title='Enregistrer sous...' fichier=tkFileDialog.asksaveasfilename(parent= Tkinter.Tk(),title=title,initialfile=model) if fichier: f=open(fichier,'w') T=self.keys() T.sort() for t in T: f.write('%s %i\n' % (t,self[t])) f.close() # -------------------- USAGE ------------------------------------------- X=sign() X.connect(srv='',usr='',pwd='',service='') X.rowscnTables() X.save() X.close()
Principe: La pseudo colonne ora_rowscn d’une table de base oracle est mise à jour à chaque update, insert de la table cette valeur est donc modifiée lorsque les données de la table varient nous allons nous appuyer dessus pour générer nos clefs de comparaison. Autre point cette fonction est croissante la valeur max d’une table variera donc à chaque modification/insertion de donnée. autres infos…