variation BD SQL Server
Le code ci dessus créer la classe sign qui permet de générer les clefs checksum de tous les objets (table,procédures stockée fonction et vues) d’une base de données SQL server.
Usage:
méthode
|
description |
sign() |
créer une instance de la classe |
connect() |
se connecte au serveur de données (ms SQL server) |
checksum() |
calcul la clef de chaque objet de la bd |
checksumTables() |
calcule la clef de toutes les tables de la bd |
checksumScripts() |
calcule la clef de touts les script procédures fonctions vues |
save() |
enregistre le résultat du calcul dans un fichier |
#-*-coding:utf-8-*-
"""
Objet
Calcul des clefs checksum de chaque objet d'une base SQL
Tables/Procédures/fonctions/vues
"""
import pymssql
import Tkinter, tkFileDialog # pour save
import time
import datetime
class sign(dict):
def __init__(self):
pass
def connect(self,srv,db,usr=None,pwd=None):
"""connexion à un serveur ms sql server"""
self.server=srv
self.database=db
if usr:
self.cnx= pymssql.connect(host=srv,user=usr,password=pwd,database=db)
else:
self.cnx= pymssql.connect(host=srv,user=usr,trusted=True)
def scripts(self):
"""retrourne la liste des nom de fonctions, vue, et procedures de la bd"""
rq = "select name from sysobjects where xtype in ('P','V','IF','TF','FN')"
crs=self.cnx.cursor()
crs.execute(rq)
ds=crs.fetchall()
crs.close()
T=[]
for dr in ds:
T.append(dr[0])
return T
def tables(self):
"""liste des tables """
rq="select name from sysobjects where xtype in ('U')"
crs=self.cnx.cursor()
crs.execute(rq)
ds=crs.fetchall()
crs.close()
T=[]
for dr in ds:
T.append(dr[0])
return T
def checksumScript(self,scriptName):
""" Objet calcul la clef du script passé en param """
self.sqlexec("create table #script(texte varchar(255))")
self.sqlexec("insert into #script exec ('sp_helptext ''%s''')" % scriptName)
R=self.checksumTable("#script")
self.sqlexec("drop table #script")
return R
def checksumTable(self,tableName):
""" Objet calcul la clef de la table passée en param """
rq="select checksum_agg(binary_checksum(*)) from %s" % tableName
R= self.sqlGetValue(rq)
if not R:
R=0
return R
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 sqlGetValues(self, requete):
"""retourne la premiere colonne d'un jeu de donnée sous form de liste"""
crs=self.cnx.cursor()
crs.execute(requete)
ds=crs.fetchall()
crs.close()
T=[]
for dr in ds:
T.append(dr[0])
return T
def sqlexec(self,requete):
"""execute l'instruction sql passée en param"""
crs=self.cnx.cursor()
crs.execute(requete)
crs.close()
def checksumTables(self):
"""calcul la clef de toutes les tables de la bd"""
self.type='tables'
self.clear()
for t in self.tables():
self[t]=self.checksumTable(t)
def checksumScripts(self):
"""calcul la clef de tous les scripts de la bd"""
self.type='scripts'
self.clear()
for s in self.scripts():
self[s]=self.checksumScript(s)
def checksum(self):
"""calcul la clef de tous les scripts et tables de la bd"""
self.type='all'
self.clear()
for x in self.tables():
self[x]=self.checksumTable(x)
for x in self.scripts():
self[x]=self.checksumScript(x)
def close(self):
self.cnx.close()
def save(self, fichier=None):
"""Sauvegarde des checksum calculés dans un fichier"""
if not fichier:
strdate=datetime.datetime.today().strftime('%Y-%m-%d_%Hh%M')
model= 'checksum.%s.%s.%s.%s.txt'%(self.server.replace('\\','.'),self.database,self.type,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()
# ------------------------------------------------------------ OK 26-10-2011
# USAGE
# créer une nouvelle instance
s=sign()
# se connecte à une bd par nom utilisateur/mot de passe
s.connect(SERVEUR,BASE,USER,PASS)
# se connecte à une bd par authentification approuvée (LDAP)
#s.connect(SERVEUR,BASE)
# calcul des checksum des tables et des scripts (tout)
#s.checksum()
# calcul des checksum des tables
s.checksumTables()
# calcul des checksum des scripts
#s.checksumScripts()
#listes des tables
#s.tables()
#liste des scripts
#s.scripts
#Sauvegarde des checksum calculés dans un fichier
s.save()
s.close()