Tôi có một tập lệnh TSQL thực hiện rất nhiều điều chỉnh cấu trúc cơ sở dữ liệu nhưng không thực sự an toàn khi để nó đi qua khi có lỗi.Thoát và khôi phục mọi thứ trong tập lệnh về lỗi
để làm cho mọi việc rõ ràng:
- sử dụng MS SQL 2005
- nó không phải là một thủ tục lưu trữ, chỉ cần một tập tin script (sql)
những gì tôi có là một cái gì đó trong những điều sau đây đặt hàng
BEGIN TRANSACTION
ALTER Stuff
GO
CREATE New Stuff
GO
DROP Old Stuff
GO
IF @@ERROR != 0
BEGIN
PRINT 'Errors Found ... Rolling back'
ROLLBACK TRANSACTION
RETURN
END
ELSE
PRINT 'No Errors ... Committing changes'
COMMIT TRANSACTION
chỉ để minh họa những gì tôi đang làm việc ... không thể đi vào chi tiết cụ thể bây giờ, vấn đề ...
Khi tôi giới thiệu một lỗi (để kiểm tra xem mọi thứ có được khôi phục không), tôi nhận được một tuyên bố rằng giao dịch ROLLBACK không thể tìm thấy một GIAO DỊCH BEGIN tương ứng. Điều này khiến tôi tin rằng một cái gì đó khi REALLY sai và giao dịch đã bị giết. những gì tôi cũng nhận thấy là kịch bản đã không hoàn toàn thoát khỏi lỗi và do đó DID cố gắng thực thi mọi câu lệnh sau khi lỗi xảy ra. (Tôi nhận thấy điều này khi các bảng mới xuất hiện khi tôi không mong đợi chúng vì nó sẽ được khôi phục)
này về cơ bản là những gì tôi được sử dụng nhưng theo hình thức sau: nếu @@ lỗi <> 0 hoặc @@ trancount = 0 bắt đầu \t \t nếu @@ trancount> 0 rollback giao dịch \t \t bộ noexec trên \t cuối –
'thiết on' noexec là một thủ thuật gọn gàng, phải nhớ rằng. – Blorgbeard
Tính năng này có hoạt động với giao dịch cấp máy chủ như 'DROP LOGIN' không? Tôi muốn thay đổi tên miền đăng nhập thuộc về và đang thả nó từ tất cả các DB nhưng cần phải tạo lại trong khi đảm bảo NOTHING bị giảm nếu không MỌI giao dịch cam kết thành công. Điều này sẽ dẫn đến các điều khoản bị ánh xạ sai, vv và sẽ là một thảm họa. – Chiramisu