Este script guardado mi carrera!
Hace unos años, estaba trabajando de forma remota en una base de datos de clientes. Actualicé un envío para cambiar su estado. Pero olvidé la cláusula where.
Nunca olvidaré la sensación en la boca del estómago cuando vi (6834 hileras afectadas). Básicamente pasé toda la noche revisando los registros de eventos y averiguando el estado correcto de todos esos envíos. ¡Mierda!
Así que escribí un script (originalmente en awk) que iniciaba una transacción para cualquier actualización y comprobaba las filas afectadas antes de confirmar. Esto evitó sorpresas.
Así que ahora nunca hago actualizaciones desde la línea de comandos sin pasar por un script como este. Aquí está (ahora en Python):
import sys
import subprocess as sp
pgm = "isql"
if len(sys.argv) == 1:
print "Usage: \nsql sql-string [rows-affected]"
sys.exit()
sql_str = sys.argv[1].upper()
max_rows_affected = 3
if len(sys.argv) > 2:
max_rows_affected = int(sys.argv[2])
if sql_str.startswith("UPDATE"):
sql_str = "BEGIN TRANSACTION\\n" + sql_str
p1 = sp.Popen([pgm, sql_str],stdout=sp.PIPE,
shell=True)
(stdout, stderr) = p1.communicate()
print stdout
# example -> (33 rows affected)
affected = stdout.splitlines()[-1]
affected = affected.split()[0].lstrip('(')
num_affected = int(affected)
if num_affected > max_rows_affected:
print "WARNING! ", num_affected,"rows were affected, rolling back..."
sql_str = "ROLLBACK TRANSACTION"
ret_code = sp.call([pgm, sql_str], shell=True)
else:
sql_str = "COMMIT TRANSACTION"
ret_code = sp.call([pgm, sql_str], shell=True)
else:
ret_code = sp.call([pgm, sql_str], shell=True)
No estoy votando ninguna respuesta hasta que vea algún código! –