2014-03-28 4 views
1

VB 응용 프로그램에서 저장 프로 시저를 실행할 때 이전 버전의 SP가 실행되는 사용자가 1 명 있습니다. 이전 버전에서는 저장 프로 시저에 대한 업데이트로 덮어 쓰여진 버전을 의미합니다.저장 프로 시저의 이전 버전을 실행하는 SQL Server

  • 우리는 1 스키마 (DBO)가
  • 내가 서버에 (마스터 포함) 다른 데이터베이스에서 동일한 SP 검사
  • 그리고 그것은 단지 우리는 사용합니까
  • 일단 존재 NT 인증
  • SQL 프로필러를 사용하여 올바른 SP가 호출되었는지 확인했습니다.
  • 난 후에도 BEGIN 첫 번째 줄에있는 SP에 다음과 같이 변경하여이 테스트 : ('!이 오류와 함께 업데이트 된 SP이다', 16,1)

    RAISERROR를

    수익을

이 사용자는이 오류가 발생하지 않고 대신 원래 오류가 발생합니다. 고정되어 있기 때문에 오류는 중요하지 않지만이 1 명의 사용자가 다른 SP를 호출하는 것과 같습니다.

좀 더 혼란스럽게하기 위해 몇 달 전에 다른 데이터베이스와 VB 앱 및 2 명의 다른 사용자가 동일한 문제를 겪었습니다. 문제를 해결하기 위해 수행 한 작업은 실제 디렉터에서 제거한 다음 다른 이름으로 추가하는 것입니다.

아무도 무슨 일이 일어나고 있는지 알지 못하며, 사용자를 재현하는 대신 다른 사람이 시도해 볼 수있는 다른 사람이 있습니까? 내가 제 정신이 아니란 것을 말해주세요.

편집 : 우리는 모두 VB 응용 프로그램과 SQL 서버와 SQL 프로파일 러를보고 SP의 이름을 변경, 그것은 이름을 변경 한 SP를 실행 않지만 여전히 SP에 있던 예전의 코드를 실행합니다. 모든 코드가 삭제되었으며 존재하는 유일한 것은 Raiserror ... 우리가 누락 된 것이 있습니다.

EDIT2 : SP에 추가 된 선택적 BIT 매개 변수가이 작업과 관련이있는 것으로 보입니다. 다음은 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입니다!' 16,1) "다음 줄에"SET NOCOUNT ON; " 사용자가 BULK INSERT에 액세스 할 수 없다는 오류가 계속 발생했지만 다른 모든 사람들이 우리가 제기 한 오류가 발생했습니다.

그런 다음이 4 명의 매개 변수가있는 테이블을 만들고 RAISERROR를 일부 SQL로 바 꾸었습니다. 한 사용자가 BULK INSERT 오류를 가져오고 테이블에 레코드가 없으면 다른 모든 사람이 레코드를 삽입하고 오류없이 프로세스를 실행합니다. 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 * SPECIFIC_NAME, SPECIFIC_SCHEMA에 의해 ROUTINE_TYPE = N'PROCEDURE '인 경우 INFORMATION_SCHEMA.ROUTINES부터 – granadaCoder

답변

1

이 우리 EDIT2에서 볼 우리가 알고 :

  1. 대량 삽입이
  2. 를 호출되고 "사용자는 여전히 대량 삽입하지만, 다른 사람 이동에 대한 액세스 권한을 가지고 있지 대한 오류가 발생했습니다 t 우리가 제기 한 오류 "

특정 T-SQL 함수 (예 : OPENQUERY, OPENROWSET, BULK INSERT 등)는 보안에 대한 사전 검증을 수행합니다. BULK INSERT를 실행하려면 사용자에게 INSERT 및 ADMINISTER BULK OPERATIONS 권한이 있어야하며 어떤 경우에는 ALTER TABLE 권한이 있어야합니다. 또한 Windows 인증을 사용하는 경우 사용자 (Windows 인증을 사용하는 경우) 또는 SQL Server 인증 (SQL Server 인증을 사용하는 경우)의 "로그온 계정"에 대한 NTFS/Active Directory 사용 권한의 유효성을 검사하여 파일을 읽을 수 있도록합니다.

사전 검증 (또는 적어도 "사전 유효성 검사"라고 부르는 것)은 저장 프로 시저 (또는 함수 등)가 호출 될 때 발생하며 각 행이 실행되지 않을 때 발생합니다. 이 시점에서 오류가 발생하면 RAISERROR 또는 로그 테이블에 대한 INSERT를 포함하여 Proc의 코드가 실행되지 않습니다.

따라서 보이는 동작의 가장 일반적인 원인은 문제가있는 사용자에게 a) 하나 이상의 필수 SQL Server 권한 또는 b) 적절한 NTFS 권한 또는 c가 부족하다는 것입니다) 무엇보다도.

오류가 BULK INSERT에 대한 액세스 권한이 없다는 것을 감안할 때,이 특정 사용자에게 하나 이상의 SQL Server 사용 권한이 없음을 알 수 있습니다.

0

당신이 (PROC을 변경 반대)를 다시 추가 한 다음 시저를 삭제하려고 유무 :

BTW, SQL 프로파일이 보여?

sp_recompile을 사용해 보셨습니까?

저장 프로 시저에 "재 컴파일"옵션을 사용해 보셨습니까?

처녀를 희생 해 봤니?

+0

시도 및 변경, 변경하지 않았습니다. 월요일에 다시 컴파일을 시도하면 사용자는 더 이상 재 시도 할 수 없습니다. 감사합니다 – Steve

1

SQL Server 데이터베이스 엔진 서비스를 다시 시작해야합니다. 당신은 SQL 프로파일 러를 실행하는 경우, Debugging does not show current stored procedure version

+0

디버깅 문제는 제가 잠시 동안 알고있는 것이지만 여기서는 그렇지 않습니다. 이것은 1.5 년 동안 생산되었습니다. 또한 변경없이 서버를 완전히 다시 시작하려고했습니다. 이 문제를 해결하기위한 유일한 방법은 사용자에게 새로운 Active Directory 로그인을 제공하는 것입니다. 이것은 우리가 모든 사용자들에게 기꺼이 할 일이 아닙니다. – Steve

0

을 당신은 이전 코드를 실행하는 것으로 보인다 사용자에 의해 호출되는 이름 PROC를 볼 수 있습니까 : 이 SO 질문을 봐? 의미, 당신은 프로파일 러에서보고있는 이벤트가 특정 사용자인지 확신합니까? Active Directory 계정을 변경하는 것이 과거에는 해당 사례에서 유일하게 성공한 유일한 방법 인 것으로 나타났습니다. 이는 SID 및/또는 로그인과 관련이 있음을 의미합니다. 같은 이름의 로그인 또는 역할을 통해 SQL Server에 로그인합니까?

로그인 이름 (예 : 이 아닌 역할)을 통해 로그인하는 경우 로그인 속성을 다른 작동하는 로그인과 비교하십시오. 기본 데이터베이스, 기본 스키마, 서버 역할, 데이터베이스 역할 등을 확인하십시오.

당신은 proc을 삭제했다가 다시 만들었지 만 여전히 "오래된"코드를 실행한다고하셨습니다. proc을 삭제하고 실행하려고 시도하는 방법은 어떻습니까? 그들이 존재하지 않을 때에도 서버를 계속 실행할 수 있다면 다음과 같은 사항을 확인하십시오 :

  • 그들이 실제로 생각하는 동일한 서버에 연결하고 있습니까 (장거리지만 총망상으로 만 제외 할 수는 없습니다). 정보는 여기에 제시).
  • 그들이 연결하고 있다고 생각하는 데이터베이스에 연결하고 있습니까?
  • proc을 다시 매핑 할 수있는 SYNONYMS이 있습니까? (SELECT * FROM sys.synonyms)
  • 관련된 어떤 번호가 절차가 있습니까 (긴 촬영하지만 그들은 granadaCoder에서 제공하는 INFORMATION_SCHEMA 쿼리에 표시되지 것)에 저장된 프로 시저 코드 및 추가 정보를 바탕으로 (SELECT * FROM sys.numbered_procedures)
+0

고마워요. 1 : 이름이 변경된 proc이 올바른 사용자에 의해 실행될 때 정확하게 호출되고 올바른 서버에서 호출되는 것을 봅니다. 그것이 이상한 일입니다. 2 : 사용자가 NT Auth를 사용하고 모든 (일반) 사용자가 역할에 있으며 역할에 따라 보안을 설정합니다. 이 역할의 다른 사용자에게는 동일한 문제가 없습니다. 3 : 우리는 proc을 삭제하려고 시도했으나 사용자는 proc를 삭제하려고 시도했으나 오류가 발생했습니다. 4 : 동의어와 번호가 매겨진 절차를 확인 했으므로 0이됩니다. – Steve

+0

@Steve :이 사용자는 당신과 같은 이름의 로그인을 가지고 있지 않습니까? 광고 그룹 (AD Group)을 통해 로그인했다는 것을 의미한다고 가정합니다. 그 역할이 그들이 얻는 유일한 길인지를 점검 할 가치가 있습니다. 어떤 일이 일어나는지 알기 위해 역할이나 AD 그룹을 벗어나는 방법이 있습니까? 그들이 proc을 실행하고 RAISERROR를 얻지 못하면 "이전"코드를 실행합니까, 아니면 오류가 발생합니까? 오류가있는 경우 그 오류는 무엇입니까 (원래 오류가 발생했다고 언급 했습니까?). 프로파일 러에서 db_id 및 object_id 필드를 표시하고 호출되는 것으로 간주되는 proc와 일치하는지 확인하십시오. –

+0

아직 확실하지 않지만 문제는 전달되지 않고 기본값 (0)으로 설정되지 않는 선택적인 BIT 매개 변수와 관련이있을 수 있습니다. 그러나 어떤 이유로 인해 다른 사용자와 다른 것으로 작동합니다. 이 사용자의 경우 0이 아니며 null이 아닙니다. 아직도 이것에 대한 테스트를하고 있습니다. – Steve

관련 문제