我正在为我的数据库中的所有对象创建DDL,以便传播到上层环境。我希望确保一个全有或全无事务,包括所有数据库对象创建/更改和数据加载插入。有没有这么简单,或者有什么需要注意的?
BEGIN TRANSACTION
-- include create script generated from ssms
-- include insert data load scripts
COMMIT我通常只使用事务进行多表插入等操作。
发布于 2018-04-07 03:39:37
试试这个:
USE [DatabaseName]
GO
BEGIN TRANSACTION Tran1
BEGIN TRY
INSERT ...
COMMIT TRANSACTION Tran1
END TRY
BEGIN CATCH
-- ROLLBACK first.
ROLLBACK TRANSACTION Tran1
END CATCH
GO请注意,如果此操作失败,并且任何具有插入数据但随后回滚的标识的表,则需要重新设定标识值的种子。由于某些原因,标识值的递增发生在事务之外。
发布于 2018-04-07 21:12:00
是的,您通常在事务中同时执行DDL和DML,以确保全部执行或全部不执行。但是,有些DDL (例如CREATE DATABASE)不能在事务中执行,而另一些(例如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;https://stackoverflow.com/questions/49699866
复制相似问题