【问题标题】:Does SQL Server Validate a stored proc before running it?SQL Server 在运行存储过程之前是否对其进行验证?
【发布时间】:2015-09-17 13:09:33
【问题描述】:

我现在检查了很多线程,但我似乎无法找到答案,我需要相当确定/确信我在回复客户之前假设这个是正确的。

所以,如标题所述,SQL Server 是否在运行存储过程之前对其进行验证?

IE:即使我有一个永远不会满足某个条件的IF statement,在运行之前会检查和验证IF statement condition 中的代码吗?

编辑:这是一个简单的例子:

DECLARE @ParamSource VARCHAR(2) = 'V3'

IF @ParamSource = 'V1'
BEGIN
    --USE LINKED SERVER HERE WHICH THROWS AN ERROR ABOUT CONNECTIONS
END

IF @ParamSource = 'V3'
BEGIN
    --DO MY ACTUAL CODE
END

我永远不会满足第一个条件,但由于某种原因,我的存储过程试图在运行时验证并不断出错。

【问题讨论】:

  • 它们在最初构建时(至少部分地)被验证,但不是在运行时。然而,对于从未验证过的动态 SQL 来说,情况并非如此。这是来自个人经验,而不是来自任何文档。但是,如果您想测试这个理论,您可以针对测试表构建一个简单的存储过程,然后从测试表中删除一列。存储过程仍会尝试运行,但会抛出错误。
  • @user2366842- 感谢您的回复...我认为它验证或执行这些操作的原因是因为我正在设置Disaster Recovery environment 和@987654326 之一@ 使用了一个链接服务器,由于某种原因我无法连接(但是,我不需要满足那个条件,我可以删除这段代码,但我只是想知道这是否是 SQL 正在做的事情?)
  • 延迟名称解析和编译:technet.microsoft.com/en-us/library/ms190686(v=sql.105).aspx(链接已更新)
  • 这一切都取决于您所说的“已验证”。
  • 使用链接服务器,您通常会在 SSMS 中遇到语法高亮问题,但只要链接服务器实际设置正确,它就会运行/“编译”。至于是否应该删除它的问题......如果链接服务器不再存在,最好简单地注释掉有问题的代码,而不是删除它(尤其是看到 SSMS 没有任何在没有数据库恢复的情况下恢复对存储过程的更改)。

标签: sql-server-2008 tsql stored-procedures


【解决方案1】:

创建存储过程时,会对其进行编译,这意味着存储过程中使用的每个对象都经过验证。对于所有现有对象,您还需要有权访问它们。这将为这个存储过程创建一个执行计划,只要过程没有改变,执行计划就应该保持有效。如果存储过程中使用的任何表对象不存在(仅表,而不是链接服务器),此时将不会创建执行计划,但如果没有发现其他错误,则会创建该过程。

在您的示例中,您需要访问链接服务器对象才能创建存储过程。创建完成后,如果您不再有权访问链接服务器,您的程序仍然会运行,但如果它需要访问链接服务器IF @ParamSource = 'V1',则会产生错误。但是,如果没有命中链接服务器IF @ParamSource = 'V3',则不会出错。

基本上,这意味着创建过程的用户需要访问链接服务器。

【讨论】:

  • 更多关于重新编译存储过程的信息:link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 2016-04-28
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多