2010-03-10 3 views
1

이상한 것입니다. 나는 그것에 저장된 proc가있는 Dev SQL Server를 가지고 있으며, UAT DB에서 같은 코드와 함께 사용하면 동일한 저장된 proc 파일이 삭제됩니다.저장된 프로 시저의 ExecuteNonQuery가 해당 프로 시저를 삭제하도록합니다.

아무도이 동작을 들었습니까?

SQL 코드 :

-- Check if user is registered with the system 
IF OBJECT_ID('dbo.sp_is_valid_user') IS NOT NULL 
BEGIN 
    DROP PROCEDURE dbo.sp_is_valid_user 
    IF OBJECT_ID('dbo.sp_is_valid_user') IS NOT NULL 
    PRINT '<<< FAILED DROPPING PROCEDURE dbo.sp_is_valid_user >>>' 
    ELSE 
    PRINT '<<< DROPPED PROCEDURE dbo.sp_is_valid_user >>>' 
END 
go 

create procedure dbo.sp_is_valid_user 

@username as varchar(20), 
@isvalid as int OUTPUT 

AS 
BEGIN 

    declare @tmpuser as varchar(20) 

    select @tmpuser = username from CPUserData where username = @username 

    if @tmpuser = @username 
     BEGIN 
     select @isvalid = 1 
     END 
    else 
    BEGIN 
    select @isvalid = 0 
     END 

END 
GO 

사용 예

DECLARE @isvalid int 
exec dbo.sp_is_valid_user 'username', @isvalid OUTPUT 
SELECT valid = @isvalid 

사용법 예제 일 하루 종일 ... 나는 C#을 통해 액세스 할 때는 UAT SQL DB에 있지만 자체 삭제 데브 원 !!

C# 코드는 :

public bool IsValidUser(string sUsername, ref string sErrMsg) 
    { 
     string sDBConn = ConfigurationSettings.AppSettings["StoredProcDBConnection"]; 

     SqlCommand sqlcmd = new SqlCommand(); 
     SqlDataAdapter sqlAdapter = new SqlDataAdapter(); 

     try 
     { 
      SqlConnection conn = new SqlConnection(sDBConn); 
      sqlcmd.Connection = conn; 
      conn.Open(); 

      sqlcmd.CommandType = CommandType.StoredProcedure; 
      sqlcmd.CommandText = "sp_is_valid_user"; 

      // params to pass in 
      sqlcmd.Parameters.AddWithValue("@username", sUsername); 

      // param for checking success passed back out 
      sqlcmd.Parameters.Add("@isvalid", SqlDbType.Int); 
      sqlcmd.Parameters["@isvalid"].Direction = ParameterDirection.Output; 

      sqlcmd.ExecuteNonQuery(); 

      int nIsValid = (int)sqlcmd.Parameters["@isvalid"].Value; 

      if (nIsValid == 1) 
      { 
       conn.Close(); 
       sErrMsg = "User Valid"; 
       return true; 
      } 
      else 
      { 
       conn.Close(); 
       sErrMsg = "Username : " + sUsername + " not found."; 
       return false; 
      } 
     } 
     catch (Exception e) 
     { 
      sErrMsg = "Error :" + e.Source + " msg: " + e.Message; 
      return false; 
     } 
    } 
+2

당신이 사용하는 예제가 다른 proc "sp_is_user_admin"을 C# 코드보다 호출하고 있습니다. 또한 C#의 USING 키워드를 조사하고 싶을 수도 있습니다. 이 코드는 모든 곳에서 연결을 유출 할 수 있습니다. – NotMe

+2

당신의 절차는 "set @isvalid = 0; CPUserData에서 @isvalid = 1을 선택하십시오. username = @username;을 선택하십시오." 따라서 임시 변수가 필요하지 않습니다. 또한 conn.Close()를 finally 블록으로 이동하는 것을 고려하십시오. – Sorpigal

+0

@ 크리스 .. 나는 방금 sp_is_valid_user, 고마워 .. 변경했습니다. 슬프게도 문제가 해결되지 않습니다. ( – FinancialRadDeveloper

답변

2

좋아, 내가 대답을 발견했다 ... 간단한 당신이 방법을 알고 때! 절차

내가 달릴 점에서 가장 좋은 대답에서 그래서

Disappearing Stored Procedure

저장 사라지고

: : 여기이 링크를 보았다

select syo.name 
from syscomments syc 
    join sysobjects syo on 
    syo.id = syc.id 
where syc.[text] like '%DROP PROC%' 

이 내 다른 하나를 내게 준 저장된 procs 다시 ... sp_is_user_admin, 그래서 나는 빠른 모양을 가지고있는 것 같지 않았다 ...

create procedure dbo.sp_is_user_admin 
@username as varchar(20), 
@isadmin as int OUTPUT 
AS 
BEGIN 

    declare @profile as varchar(20) 

    select @profile = profile from CPUserData where username = @username 

    if @profile = 'admin' 
     BEGIN 
     select @isadmin = 1 
     END 
    else 
     BEGIN 
     select @isadmin = 0 
     END 

END 

--********************************************************************************* 

-- Check if user is registered with the system 
IF OBJECT_ID('dbo.sp_is_valid_user') IS NOT NULL 
BEGIN 
    DROP PROCEDURE dbo.sp_is_valid_user 
    IF OBJECT_ID('dbo.sp_is_valid_user') IS NOT NULL 
     PRINT '<<< FAILED DROPPING PROCEDURE dbo.sp_is_valid_user >>>' 
    ELSE 
     PRINT '<<< DROPPED PROCEDURE dbo.sp_is_valid_user >>>' 
END 

Doh !!! blighter가 있습니다. C#에서 무슨 일이 일어나는지는 사용자가 유효하다면 관리자인지 아닌지를 기반으로 볼 수있는 항목을 선택하고 sp_is_valid_user proc를 호출하는 것입니다. 불쾌한 부작용!

// check the user is entitled to use the system at all 
if (usrData.IsValidUser(sCurrentUserName, ref sErrMsg)) 
{ 
    // if the user is admin then let them spoof and edit their own data 
    if (usrData.UserIsAdmin(sCurrentUserName, ref sErrMsg)) 
    { 
     chkSpoof.Visible = true; 
     grdvwUserDataFromDB.Visible = true; 
    } 
} 
else 
{ 
    // redirect them away 
    Response.Redirect("UserNotRegistered.aspx"); 
    return; 

} 

다른 사람이 도움이되기를 바랍니다.

추 신 : DB Artisan은 고약한이고 내 개발 툴킷에서 전체 SQL Server를 사용할 수 있다면 프로파일 러를 사용하여이 호출을 볼 수있었습니다. ; P 필자는 Visual Studio에 맞는 SP/업데이트가 없기 때문에 SQL Server 2008을 설치할 수 없으며 여기 IT 부서에서이를 정렬 할 수 없습니다!

관련 문제