2014-03-28 32 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