ฉันมีALTER TABLE
ข้อความบางส่วนที่ฉันใช้อยู่ ไม่ใช่ทั้งหมดที่ทำงาน (เป็นผลมาจากการรันการเปรียบเทียบข้อมูล SQL) และฉันต้องการจัดกลุ่มพวกเขาในบางธุรกรรมและย้อนกลับคำสั่งหากมีสิ่งผิดปกติ
เป็นไปได้หรือเป็นเพียงข้อมูลที่สามารถย้อนกลับได้?
ฉันมีALTER TABLE
ข้อความบางส่วนที่ฉันใช้อยู่ ไม่ใช่ทั้งหมดที่ทำงาน (เป็นผลมาจากการรันการเปรียบเทียบข้อมูล SQL) และฉันต้องการจัดกลุ่มพวกเขาในบางธุรกรรมและย้อนกลับคำสั่งหากมีสิ่งผิดปกติ
เป็นไปได้หรือเป็นเพียงข้อมูลที่สามารถย้อนกลับได้?
คำตอบ:
BEGIN TRANSACTION
BEGIN TRY
ALTER TABLE1...
ALTER TABLE2...
-- Additional data/structural changes
COMMIT
END TRY
BEGIN CATCH
ROLLBACK;
THROW; -- Only if you want reraise an exception (to determine the reason of the exception)
END CATCH
SET XACT_ABORT ON
และสุดท้ายCOMMIT TRAN
ลบล้างความจำเป็นในการที่TRY
บล็อก?
ใช่มันเป็นไปได้
คำสั่ง DDL ส่วนใหญ่สามารถย้อนกลับใน SQL Server (มีข้อยกเว้นบางประการเช่นCREATE DATABASE
)
การเปลี่ยนแปลงจำนวนมากในการทำธุรกรรมด้วยrollback
และcommit
- มันไม่ใช่ความฝัน มันเป็นไปได้.
นี่คือโครงสร้างสำหรับสคริปต์ของคุณ ( ปฏิบัติตามแนวทาง MSพร้อมการปรับปรุง):
BEGIN TRANSACTION
BEGIN TRY
-- place your script in this TRY block
-- your DDL instructions:
ALTER TABLE1...
ALTER TABLE2...
-- data modifications:
EXEC('
UPDATE A
SET c1 = 23,
c2 = ''ZZXX'';
');
-- another DDL instruction:
ALTER TABLE2...
-- end of your script
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
-- If you want reraise an exception (to determine the reason of the exception)
-- just uncomment block with appropriate version:
-- SQL SERVER > 2012
/*
THROW;
*/
-- SQL SERVER < 2012 (tested against 2008 R2)
/*
DECLARE @ErrorMessage VARCHAR(MAX);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (
@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
*/
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
GO
ระวังใช้THROW
งานได้เฉพาะกับเวอร์ชันเซิร์ฟเวอร์ SQL> 2012 ที่นี่คุณสามารถแปลงรุ่นจากรูปแบบsemverเป็นรูปแบบปี : http://sqlserverbuilds.blogspot.ru (ไม่ทราบ.ru
โดเมนมีรุ่นภาษาอังกฤษ)
คุณต้องตรวจสอบธุรกรรมและการจัดการข้อยกเว้นใน T-SQL ลองดูตัวอย่างสองตัวอย่างสุดท้ายในหน้านี้: http://msdn.microsoft.com/en-us/library/ms175976.aspx