Kịch bản này lưu nghề nghiệp của tôi!
Khá một vài năm trước, tôi đã làm việc từ xa trên cơ sở dữ liệu khách hàng. Tôi đã cập nhật một lô hàng để thay đổi trạng thái của nó. Nhưng tôi quên mệnh đề where.
Tôi sẽ không bao giờ quên cảm giác trong hố dạ dày khi tôi thấy (6834 hàng bị ảnh hưởng). Về cơ bản, tôi đã trải qua cả đêm thông qua các bản ghi sự kiện và tìm ra trạng thái phù hợp trên tất cả các lô hàng đó. Crap!
Vì vậy, tôi đã viết một tập lệnh (ban đầu là awk) sẽ bắt đầu giao dịch cho bất kỳ cập nhật nào và kiểm tra các hàng bị ảnh hưởng trước khi cam kết. Điều này ngăn cản bất kỳ điều bất ngờ nào.
Vì vậy, bây giờ tôi không bao giờ cập nhật từ dòng lệnh mà không phải trải qua một kịch bản như thế này. Đây là (bây giờ bằng 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)
Nguồn
2008-12-22 16:12:27
Tôi không upvoting bất kỳ câu trả lời nào cho đến khi tôi thấy một số mã! –