Этот сценарий спас мою карьеру!
Несколько лет назад я работал удаленно в базе данных клиентов. Я обновил груз, чтобы изменить его статус. Но я забыл, где предложение.
Я никогда не забуду ощущения в яме живота, когда увижу (6834 строки затронуты). В основном я всю ночь проводил журналы событий и выяснял надлежащий статус на всех этих отправлениях. Crap!
Итак, я написал сценарий (первоначально в 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)
Я не отвечаю на любые ответы, пока не вижу какой-то код! – 2008-10-07 01:24:16