我为我的数据库中的所有对象创建DDL,以便传播到上层环境。我想确保一个全有或全无的事务,包括所有数据库对象创建/更改和数据加载插入。它是这么简单还是有任何警告?
BEGIN TRANSACTION
-- include create script generated from ssms
-- include insert data load scripts
COMMIT
我通常只使用多表插入等事务。
答案 0 :(得分:0)
试试这个:
USE [DatabaseName]
GO
BEGIN TRANSACTION Tran1
BEGIN TRY
INSERT ...
COMMIT TRANSACTION Tran1
END TRY
BEGIN CATCH
-- ROLLBACK first.
ROLLBACK TRANSACTION Tran1
END CATCH
GO
请注意,如果此操作失败且任何具有已插入数据但随后回滚数据的表的表,则需要重新标识身份值。出于某种原因,Identity值的递增发生在事务之外。
答案 1 :(得分:0)
是的,您通常在事务中执行DDL和DML以确保全部或全部。但是,某些DDL(例如CREATE DATABASE
)无法在事务中执行,而其他DDL(例如CREATE SCHEMA
)必须是批处理中的唯一语句。
除了这些限制,您可以在T-SQL脚本中使用事务和结构化错误处理:
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRANSACTION;
-- include create script generated from ssms
-- include insert data load scripts
COMMIT;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK;
THROW;
END;