Этот скрипт спас мою карьеру!
Несколько лет назад я удаленно работал с клиентской базой данных. Я обновил груз, чтобы изменить его статус. Но я забыл, где пункт.
Я никогда не забуду ощущение в животе, когда я увидел (затронуто 6834 ряда). В основном я провел всю ночь, просматривая журналы событий и выясняя правильный статус всех этих поставок. Дерьмо!
Поэтому я написал скрипт (изначально в awk), который запускал транзакцию для любых обновлений и проверял строки, на которые влияют, перед фиксацией. Это предотвратило любые неожиданности.
Так что теперь я никогда не делаю обновления из командной строки, не пройдя такой скрипт. Вот оно (сейчас в 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)