【问题标题】:Sql threw error when executed under transactionsql在事务下执行时抛出错误
【发布时间】:2009-05-26 13:20:23
【问题描述】:

我正在尝试在事务下执行以下语法,但它会抛出错误:-

这是我在事务下执行的脚本:-

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
-- full text search is installed. Run the necessary procedures
BEGIN
    declare @dbName nvarchar(128)
    select @dbName = DB_Name()
    exec('ALTER DATABASE [' + @dbName + '] SET RECOVERY SIMPLE')

    if(0 = DATABASEPROPERTY(DB_Name(),'IsFulltextEnabled'))
    BEGIN
        -- Full text is installed but not enabled on the Database. Enable that
        EXEC sp_fulltext_database 'enable'  
    END

    -- Check if there are current tables in full text search. If yes, remove them
    if(1 = INDEXPROPERTY(Object_id('Blog'),'PK_Blog','IsFulltextKey'))
    BEGIN
        -- Drop the full text index
        EXEC sp_fulltext_table 'Blog','drop'
    END
END

我收到以下错误:-

多语句事务中不允许使用 ALTER DATABASE 语句。 不能在事务中执行过程“sys.sp_fulltext_table”。 不能在事务中执行过程“sys.sp_fulltext_table”。 不能在事务中执行过程“sys.sp_fulltext_table”。

大家有什么想法吗?

编辑:- 我想知道有没有办法做到这一点。我正在尝试更改数据库中列的数据类型,并且它们已启用全文搜索,因此我希望以某种方式完成上述操作。 :(

【问题讨论】:

  • 也许错误信息没有说谎?

标签: .net sql sql-server


【解决方案1】:

你在问什么?

您收到了一条错误消息,准确地解释了问题所在。您不能在事务下执行该 SPROC。

【讨论】:

    【解决方案2】:

    这里的问题是,大多数数据定义语言语句 (DDL)(如 Alter Database)在执行时都会发出隐式提交。 TSQL 代码试图通过告诉您“您不能这样做”来保护您免受某些意外结果的影响。

    【讨论】:

      【解决方案3】:

      您可以尝试推出自己的交易。基本上,在每个步骤中记录已完成的操作,如果有任何失败,请手动撤消这些步骤直至失败点。但是这很危险,因为如果发生灾难性故障,那么您可能无法回滚所有内容,并且总是有可能错过某些组合。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-20
        相关资源
        最近更新 更多