交易等级延迟耐久性

时间:2018-01-03 09:34:50

标签: sql sql-server tsql

我们希望将Transaction Level延迟持久性部署到我们的数据库。

COMMIT

我们的许多客户端SQL服务器都是2014年所以应该没问题,但我们仍然有一些客户端使用2010 - 问题是我们将相同的代码部署到所有客户端 如果我在审计日志中使用事务级别延迟持久性写入2014年前服务器会发生什么 - 他们会忽略它还是会出错?我知道在2014年如果没有打开DD,它就会被忽略 - 只是不确定2014年前服务器如何处理DELAYED DURABILITY = ONIF ELSE) 我知道我可以进行版本检查并申请slicing但不确定是否必要 感谢

1 个答案:

答案 0 :(得分:0)

我在版本检查后尝试使用动态SQL,以便代码可以解析但不能在2014年前的服务器上运行(我们将代码部署到多个服务器类型,并且不想创建相同的2010,12,14版本代码)

DECLARE @SQL NVARCHAR (1000)

SELECT * FROM TBL_TEST_TABLE

SET @SQL = 'BEGIN TRANSACTION'
EXEC sp_executesql @SQL
SET @SQL = ''

            INSERT INTO TBL_TEST_TABLE (TEST_COLUMN)
            VALUES (2020)
            SELECT * FROM TBL_TEST_TABLE

DECLARE @SQLVERSION NVARCHAR(128)
SET @SQLVERSION = CAST(SERVERPROPERTY('PRODUCTVERSION') AS NVARCHAR)
SET @SQLVERSION = SUBSTRING(@SQLVERSION, 1, CHARINDEX('.', @SQLVERSION) - 1)

    IF @SQLVERSION < 12 
    BEGIN

        SET @SQL = 'ROLLBACK'
        EXEC sp_executesql @SQL
        SET @SQL = ''
    END


    IF @SQLVERSION > 10
    BEGIN

        SET @SQL = 'COMMIT WITH (DELAYED_DURABILITY = ON)'  
        EXEC sp_executesql @SQL
        SET @SQL = ''
    END 

 SELECT * FROM TBL_TEST_TABLE

交易似乎有效,因为更新已提交,但我收到错误

EXECUTE之后的事务计数表示BEGIN和COMMIT语句的数量不匹配。先前的计数= 0,当前计数= 1。 和 EXECUTE之后的事务计数表示BEGIN和COMMIT语句的数量不匹配。先前的计数= 1,当前计数= 0。

这纯粹是因为我正在使用动态SQL - 如果它实际提交的数据错误怎么回事?

相关问题