这种方法是否可以在事务中执行ddl?

时间:2018-04-06 19:32:22

标签: sql sql-server tsql ssms

我为我的数据库中的所有对象创建DDL,以便传播到上层环境。我想确保一个全有或全无的事务,包括所有数据库对象创建/更改和数据加载插入。它是这么简单还是有任何警告?

BEGIN TRANSACTION

-- include create script generated from ssms

-- include insert data load scripts

COMMIT

我通常只使用多表插入等事务。

2 个答案:

答案 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;