首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这种方法是否适用于在事务中执行ddl?

问这种方法是否适用于在事务中执行ddl?
EN

Stack Overflow用户
提问于 2018-04-07 03:32:22
回答 2查看 59关注 0票数 0

我正在为我的数据库中的所有对象创建DDL,以便传播到上层环境。我希望确保一个全有或全无事务,包括所有数据库对象创建/更改和数据加载插入。有没有这么简单,或者有什么需要注意的?

代码语言:javascript
复制
BEGIN TRANSACTION

-- include create script generated from ssms

-- include insert data load scripts

COMMIT

我通常只使用事务进行多表插入等操作。

EN

回答 2

Stack Overflow用户

发布于 2018-04-07 03:39:37

试试这个:

代码语言:javascript
复制
USE [DatabaseName]
GO

BEGIN TRANSACTION Tran1
    BEGIN TRY
        INSERT ...
        COMMIT TRANSACTION Tran1
    END TRY
    BEGIN CATCH
        -- ROLLBACK first.
        ROLLBACK TRANSACTION Tran1
    END CATCH
GO

请注意,如果此操作失败,并且任何具有插入数据但随后回滚的标识的表,则需要重新设定标识值的种子。由于某些原因,标识值的递增发生在事务之外。

票数 0
EN

Stack Overflow用户

发布于 2018-04-07 21:12:00

是的,您通常在事务中同时执行DDL和DML,以确保全部执行或全部不执行。但是,有些DDL (例如CREATE DATABASE)不能在事务中执行,而另一些(例如CREATE SCHEMA)必须是批处理中的唯一语句。

除了这些限制之外,您可以在T-SQL脚本中同时使用事务和结构化错误处理:

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49699866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档