このスクリプトは私のキャリアを救いました!
かなり数年前、私はクライアントデータベースでリモートで作業していました。貨物を更新してステータスを変更しました。しかし、where句を忘れました。
私が見たときの胃の穴の感覚を決して忘れません(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)