【问题标题】:TSQL ENCRYPTBYPASSPHRASE Function In Sql Server 2019Sql Server 2019 中的 SQL ENCRYPTBYPASSPHRASE 函数
【发布时间】:2020-09-04 13:56:07
【问题描述】:

所以我有这样的简单字符串加密包装函数:

CREATE FUNCTION dbo.FncStringEncrypt(
    @Cipher NVARCHAR(MAX),
    @Text NVARCHAR(MAX),
    @Salt NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN

    IF @Cipher IS NULL OR @Cipher = ''
    BEGIN
        RETURN NULL
    END

    IF @Text IS NULL OR @Text = ''
    BEGIN
        RETURN NULL
    END


    DECLARE @_encryptionBinary varbinary(max)

    IF @Salt IS NOT NULL AND 
        @Salt <> ''
    BEGIN
        set @_encryptionBinary = ENCRYPTBYPASSPHRASE(@Cipher, @Text, 1, @Salt)
    END
    ELSE
    BEGIN
        set @_encryptionBinary = ENCRYPTBYPASSPHRASE(@Cipher, @Text)
    END


    RETURN cast('' as xml).value('xs:base64Binary(sql:variable("@_encryptionBinary"))', 'varchar(max)')

END

在各种版本 14 及更低版本的机器上试过,效果很好。 当我在 Sql Server 2019(版本:15.0.2070.41)中使用它时,我收到错误消息:

消息 596,第 21 级,状态 1,第 0 行 无法继续执行,因为会话处于终止状态。 消息 0,级别 20,状态 0,行 0 当前命令发生严重错误。结果,如果有的话,应该丢弃。 完成时间:2020-06-13T20:32:25.6110034+03:00

但奇怪的是,如果我单独使用 ENCRYPTBYPASSPHRASE 那么它适用于每个版本:

SELECT ENCRYPTBYPASSPHRASE('aglmule','ilemak',1,'ilemak')

【问题讨论】:

  • 我怀疑这是一个内联问题。如果您禁用内联(在函数定义中使用WITH INLINE = OFF),您会得到相同的行为吗? Disabling Scalar UDF Inlining without changing the compatibility level
  • @Larnu 的怀疑是正确的。除非我指定提示或关闭TSQL_SCALAR_UDF_INLINING 数据库范围配置,否则我在使用该函数时会在错误日志中看到访问冲突。
  • 欣赏答案。非常感谢。

标签: tsql sql-function sql-server-2019


【解决方案1】:

您应该升级到SQL Server 2019 CU4 或更高版本,其中several inlining issues 是固定的(those that were fixed in CU2 除外)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-08
    • 2020-05-13
    • 2023-03-16
    • 2021-11-29
    • 2022-01-18
    • 2020-03-31
    • 1970-01-01
    • 2020-06-01
    相关资源
    最近更新 更多