2014-03-28 29 views
1

我们有1个用户,当他们从VB应用程序运行存储过程时,它运行SP的旧版本。对于旧版本,我的意思是由存储过程更新覆盖的版本。SQL Server运行旧版本的存储过程

  • 我们只有1种模式(DBO)
  • 我在任何其他数据库的服务器上(包括主站)检查同一SP,而且只存在一次
  • 我们使用NT验证
  • 我使用SQL Profiler来确保正确调用了正确的SP并且它是。
  • 我连这个测试通过进行以下更改到第一行的SP BEGIN后:(“!这是更新的SP有一个错误”,16,1)

    RAISERROR

    回报

此用户没有收到此错误,他们反而得到原始错误。他们得到的错误并不重要,因为它已被修复,但它就像这1个用户正在调用不同的SP。

为了让事情更加令人困惑,几个月前我们遇到了同样的问题,使用不同的数据库和vb应用程序以及2个不同的用户。我们如何解决他们的问题是将他们从活动导演中删除,然后添加他们不同的名字。

有没有人有任何可能发生的事情的想法,我可以尝试的其他事情,而不是重新创建用户,或有任何其他人跑过这个?请告诉我,我不是疯了。

编辑:我们在两个VB应用程序和SQL Server和看SQL事件探查器改变了SP的名称,但它运行更名为SP,但它仍然运行旧的代码,这是在SP。所有的代码已被删除,唯一存在的是Raiserror ...必须有我们缺少的东西。

EDIT2:会出现一个可选的BIT参数添加到SP与此有关。这里是什么SP看起来像几个月一改之前前:

ALTER PROCEDURE [dbo].[BulkLoadSomeData] 
    @UserName varchar(50), 
    @FileName as varchar(max), 
    @OriginalFileName as varchar(max) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    BULK INSERT .... 
    ...Process the data... 
END 

与现在:

ALTER PROCEDURE [dbo].[BulkLoadSomeData] 
    @UserName varchar(50), 
    @FileName as varchar(max), 
    @OriginalFileName as varchar(max), 
    @HasElevatedSecurity bit = 0 
AS 
BEGIN 
    SET NOCOUNT ON; 
    IF @HasElevatedSecurity = 0 BEGIN 
    ...Stick this into a process queue to run with higher priviledges... 
    ...code ommited... 
    RETURN --Must return so we dont run the rest of the code 
    END 
    BULK INSERT ....  
    ...Process the data... 
END 

所以我们增加了“RAISERROR(‘这是更新的SP有一个错误!’ “SET NOCOUNT ON;”之后的行上)而且用户仍然得到了无法访问BULK INSERT的错误,但其他人都遇到了我们正在提出的错误。

然后我创建了一个表格,其中包含这四个参数,并用一些插入SQL替换了RAISERROR。一个用户获得BULK INSERT错误并且表中没有记录,其他人都插入记录并运行该过程而没有错误。在SQL事件探查器中,所有的exec语句都是相同的。

BTW,SQL事件探查表明这一点:

exec BulkLoadSomeData @UserName='User1', @FileName='UNC Path and file name with no special characters', @OriginalFileName='Line the other file name' 
+1

你有没有尝试过从同一个用户在VB之外执行SP?如果是的话,他会得到哪个SP? –

+0

@AdelSal,我没有,因为这是没有安装任何管理工具的最终用户。我不得不称呼它的唯一方法是通过VB。除非你知道另一种方式。 – Steve

+0

运行此查询..确保您没有“倍数”。 SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = N'PROCEDURE'order by SPECIFIC_NAME,SPECIFIC_SCHEMA – granadaCoder

回答

1

我们看到下EDIT2我们知道:

  1. BULK INSERT被称为
  2. “用户仍然得到了错误约没有访问BULK INSERT但每个人去t我们正在提出的错误“

某些T-SQL函数(例如, OPENQUERY,OPENROWSET,BULK INSERT等)对安全性进行预验证。用户必须具有INSERT和ADMINISTER BULK OPERATIONS权限,并且在某些情况下需要ALTER TABLE以执行BULK INSERT。此外,将验证用户(如果使用Windows身份验证)或SQL Server服务(如果使用SQL Server身份验证)的“登录身份”帐户的NTFS/Active Directory权限,以确保该文件可读。

当存储过程(或函数等)被调用时,预验证(或者至少我称之为“预验证”)发生,而不是每行被执行。如果此时发生错误,那么将执行Proc中的任何代码,包括RAISERROR或INSERT到日志表中。

因此,您所看到的行为的最可能原因是具有该问题的用户缺少a)一个或多个必需的SQL Server权限,或b)适当的NTFS权限或c ) 上述所有的。

鉴于该错误是关于无法访问BULK INSERT,我的猜测是该特定用户缺少一个或多个SQL Server权限。

0

你有没有尝试丢弃PROC然后重新添加它(而不是改变PROC)?

您是否尝试过使用sp_recompile?

您是否尝试过使用存储过程中的“with recompile”选项?

你试过牺牲一个处女吗?

+0

尝试下降并创建,没有变化。将在周一尝试重新编译,用户今天将无法再重试。谢谢 – Steve

1

您必须重新启动SQL Server数据库引擎服务。 看一看这太问题: Debugging does not show current stored procedure version

+0

调试问题是我已经知道的一段时间,但这不是这种情况。这已经生产了1.5年。另外,我们已经尝试完全重新启动服务器,没有任何变化。我们发现解决此问题的唯一方法是为用户提供新的Active Directory登录。这不是我们愿意为所有用户做的事情。 – Steve

0

当您运行SQL事件探查器,你看到的更名PROC通过谁似乎运行的旧代码的用户被称为?意思是,你确定你在Profiler中看到的事件是那个特定的用户吗?您表示,更改Active Directory帐户是过去唯一适用于此案例的情况,这意味着这与他们的SID和/或登录有关。他们是通过同名的登录还是通过角色登录到SQL Server?

如果通过登录他们的名字登录(即不是的角色),然后比较他们的登录属性与其他工作的登录。检查诸如:默认数据库,默认模式,服务器角色,数据库角色。

你说你删除并重新创建了proc,但他们仍然运行“旧”代码。如何删除proc并让它们尝试执行它。如果他们仍然可以运行它时,它不存在,然后检查之类的东西:

  • 他们真的连接到你认为他们是(长镜头,但完全基于不能被排除在同一台服务器信息在这里呈现)。
  • 他们是否连接到您认为他们正在连接的数据库?
  • 有没有可能重新映射过程的任何SYNONYMS? (SELECT * FROM sys.synonyms
  • 是否有参与任何编号的程序(长镜头,但他们不会被granadaCoder提供的INFORMATION_SCHEMA查询显示)根据存储过程的代码和其他信息(SELECT * FROM sys.numbered_procedures
+0

感谢您关注此事。 1:我看到重命名的proc正好在正确的用户正在运行时以及在正确的服务器上被调用。这真是太奇怪了。 2:用户使用NT Auth,每个(普通)用户都在角色中,我们根据角色设置安全性。此角色中的其他用户不具有相同的问题。 3:我们尝试删除proc,并且用户得到了一个关于它不存在的错误。 4:检查同义词和编号的程序,我们有零。 – Steve

+0

@Steve:这个用户是否有一个你认为不存在的同名域名?我假设你的意思是他们通过AD组登录。值得检查,以确保角色是他们进入的唯一途径。是否有办法让他们脱离角色或广告组来查看会发生什么?当他们运行proc并且没有得到你的RAISERROR时,它会运行“旧”代码还是会出错?如果错误,那是什么错误(你提到他们得到“原始错误”)?在Profiler中,显示db_id和object_id字段,并确保它们与您认为正在调用的proc相匹配。 –

+0

我还不确定,但问题可能与一个可选的BIT参数有关,该参数没有被传递并且没有被设置为默认值(0),但由于某种原因,它对这个用户的作用与其他人不同。对于这个用户,它不是0,它不为空。仍然在做这个测试。 – Steve