【问题标题】:Cannot add a stored procedure to database due to encryption message由于加密消息,无法将存储过程添加到数据库
【发布时间】:2018-09-30 04:57:38
【问题描述】:

我设置了一个本地数据库 (SQL Server 2017 Express)。一切正常,但是在 SSMS 中创建一个简单的存储过程时,我遇到了错误。

比如这个

CREATE PROCEDURE [dbo].[EMS_Operations_SyncAssetTableByID2]
    @Table_Name VARCHAR(255),
    @Ids_For_Update VARCHAR(255),
    @Is_Test BIT = 0
AS
BEGIN
    DECLARE @DB_String varchar(55) ='Redesign'
END

不会运行,我收到错误消息:

消息 156,第 15 级,状态 1,第 1 行
关键字“PROCEDURE”附近的语法不正确。

消息 156,第 15 级,状态 1,第 1 行
关键字“PROCEDURE”附近的语法不正确。

消息 8180,级别 16,状态 1,过程 sp_describe_parameter_encryption,第 1 行 [批处理开始第 0 行]
无法准备报表。

消息 8180,级别 16,状态 1,过程 sp_describe_parameter_encryption,第 1 行 [批处理开始第 0 行]
无法准备报表。

执行批处理时出错。错误信息是:内部错误。 sp_describe_parameter_encryption 返回的结果集格式无效。缺少其中一个结果集。

我不确定是什么原因造成的,或者数据库中是否存在损坏,因为数据库中有加密,我不确定它在调用什么。

我还注意到批处理中第一个 SQL 语句下面有一条蓝线,上面写着

@DB_String 将被转换为具有以下属性的 System.Data.SqlClient.SqlParameter:SqlDbType = varchar,Size 55, Precision=0

当我在我们的远程服务器上运行相同的代码时,它可以毫无问题地完成。知道是什么原因造成的吗?

【问题讨论】:

  • 你的存储过程的参数必须在括号内
  • @GuidoG 不,这不是真的,即使是这样,也会导致不同的错误消息。
  • 工具 > 选项 > 查询执行 > SQL Server > 高级 > 为 Always Encrypted 启用参数化。这是检查吗?尝试取消选中它(至少暂时)。

标签: sql-server ssms sql-server-2017


【解决方案1】:

Aaron Betrand 在上面发表的评论

“工具”>“选项”>“查询执行”>“SQL Server”>“高级”>“为 Always Encrypted 启用参数化”。是否已检查。'

解决了这个问题。我之前一直在尝试使用 Always Encrypted,并已将其删除,但此设置仍处于启用状态,并参数化了导致此问题的过程。

【讨论】:

    【解决方案2】:

    这可能是由始终加密功能引起的。

    如果您不打算使用参数化。您可以在声明后手动设置所有变量。
    例如:
    DECLARE @DB_String varchar(55)
    SET @DB_String ='Redesign'

    或者,您可以右键单击查询->连接->更改连接->选项>>找到[附加连接参数]页面->在该框区域中,输入:
    列加密设置=禁用
    这也会禁用参数化。

    如果您确实需要参数化来加密这些变量,您目前似乎只能在查询级别进行。存储过程不适用于 Always Encrypted,因为它可以被其他具有不同列加密设置的用户调用。

    【讨论】:

      猜你喜欢
      • 2011-09-05
      • 2014-09-02
      • 2013-03-30
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 2019-07-02
      • 2011-04-26
      • 2021-08-20
      相关资源
      最近更新 更多