这是我的问题。我正在使用SQL Server 2014.我有一个ASP.Net Web应用程序,它接受来自用户的字符串。该字符串被传递给存储过程(SP),该存储过程查询查询链接服务器的视图。我的数据访问层向我的业务对象返回一个数据表。如果有数据 - 输入的字符串被认为是有效的(它在链接的服务器上有匹配)。如果没有数据,输入的字符串被认为是无效的(链接服务器上没有匹配)。需要定期删除并重新创建存储过程?
那么简单,这里是信息的路径:
Web应用程序 - 存储过程 - 视图 - 链接服务器 - 表数据
显然,这条道路是相反的,一旦执行查询(和数据传递从表格并最终到网络应用程序)。
这里是它变得奇怪。自创建SP(今天是第二次)以来,在过去13个月中曾两次没有数据在VALID字符串输入时返回到Web应用程序。要清楚的是,这个SP总是有效(除了这两次)。但是,一旦失败,它就不会运行,直到它被丢弃并重新创建。
所以,这里是什么工作:
- 查询链接服务器,直接,并添加字符串到 WHERE子句。
- 直接查询视图,并将字符串添加到WHERE 子句中。
这里是行不通:
- 输入串入网络的应用程序。
- 直接查询SP,并将字符串作为参数传递。
而且真的,真的很怪异的一部分:
两次出现这种情况,删除并重新创建存储过程解决了这个问题。 SP如何运行数月,然后停止工作?那么如何解决这个问题呢就是放弃并重新创建SP?
首先,这是为什么发生?还有很多其他的Web应用程序调用SP,它们调用视图,调用从未失败的SAME链接服务器。但一年两次ONE SP失败没有明显的原因 - 删除并重新创建它解决了这个问题?
请帮忙 - 这真是令人困惑......请让我知道你是否需要更多信息。
编辑
针对alroc的评论:
- 创建存储过程并没有什么 做安全的脚本。任何可以访问数据库的用户都可以访问SP。
- 我是这里唯一的DBA,所以没有其他人“应该”更改DB上的任何 安全或权限。但是,如果他们在做 ,那么我会在其他地方预期这些问题,因为网络应用程序 使用相同的SQL登录(相同的连接字符串),适用于每个其他进程的 - 并且有数百个。
第二个编辑
针对beercohol的评论:
- 查询不超时 - 它不返回任何结果几乎瞬间。 超时设置为30秒,接近 的阈值接近此阈值。
- 我运行了DBCC CheckDB,没有发现错误。
- 我会在下次发生这种情况时尝试重新编译SP,但为什么执行计划会定期对数百或数千个SP中的某个SP执行失败?
创建SP的脚本是否也授予与其相关的任何安全性?如果是这样,是否有人可能会“修复”安全性,并在这个过程中撤销你的SP所依赖的东西? – alroc
@alroc我编辑了我的答案以回应您的评论。 –
我会检查两件事 - 1)你确定查询在返回“无数据”时没有超时? 2)运行DBCC CHECKDB检查数据库是否损坏。 – beercohol