2013-11-25 5 views
2

SQL Server 2008에 저장 프로 시저가 있습니다.이 저장 프로 시저의 작업은 매우 간단합니다. 데이터를 테이블에 삽입합니다. 해당 테이블의 열 중 하나가 varchar 유형이고 해당 열의 데이터 유효성 검사에 문제가 있습니다. 클라이언트 코드가 전달되는 모든 값을 수락합니다. 이는 발생할 것으로 예상됩니다. 그 칼럼에 'NEW'를 삽입하지 말라고 들었습니다. 클라이언트 코드는 신비하게도 'NEW'를 저장 프로 시저 매개 변수로 보내고 저장 프로 시저는 그 값을 그대로 삽입합니다. 나는 이것이 클라이언트 코드에 의해 처리되어야 함을 이해한다. 그러나 테이블 데이터에 대한 책임은 - 저장 프로 시저가 'NEW'를 찾을 때 예외를 던질 계획입니다. 이것을 어떻게 할 수 있습니까?저장 프로 시저의 데이터 유효성 검사

이 내 저장 프로 시저의 형식입니다 :

ALTER PROCEDURE Object_Save 
    @Id int = 0 OUTPUT    
    ,@OrderId int 
    ,@OrderNumber varchar(20) 
AS 
    BEGIN TRY 
     IF @Id = 0 
      BEGIN 
       INSERT INTO Table_Order(OrderId, OrderNumber) 
       VALUES (@OrderID, @OrderNumber) 

       Set @Id = SCOPE_IDENTITY() 
      END 
     ELSE 
      BEGIN 
       -- Update 
      END 
    END TRY 
    BEGIN CATCH 
     exec error_catch 
    END CATCH 
+0

식으로 뭔가를 할 수있는 것 같아요 그 자체? –

+0

제약 조건을 고려했지만 관리자가 레코드 삭제를 허용하지 않습니다. 활성/비활성 레코드를 추적하는 '삭제됨'플래그가 있습니다. 일단 삽입되면 삭제가 허용되지 않습니다. –

+1

말 그대로 'NEW'라는 단어를 삽입하고 싶지 않습니까? 그것을 제거하거나 실패하고 싶습니까? 매개 변수 클라이언트가 값 "New"를 전달하는 – Andrew

답변

2

난 당신이 또한 당신이 잘못된 데이터를 정리하고 열에 대한 점검 제한 조건을 고집하는 생각이이

ALTER PROCEDURE Object_Save 
    @Id int = 0 OUTPUT    
    ,@OrderId int 
    ,@OrderNumber varchar(20) 
AS 
    BEGIN TRY 
     IF @Id = 0 
      BEGIN 
     /*Say clients been passing value "New" to @OrderNumber*/ 

      IF (@OrderNumber = 'New') 
      BEGIN 
       RAISERROR('Invalid OrderNumber Please Provide valid value', 16, 1) 
       RETURN 
      END 

       INSERT INTO Table_Order(OrderId, OrderNumber) 
       VALUES (@OrderID, @OrderNumber) 

       Set @Id = SCOPE_IDENTITY() 
      END 
     ELSE 
      BEGIN 
       -- Update 
      END 
    END TRY 
    BEGIN CATCH 
     exec error_catch 
    END CATCH 
+0

TRY ... CATCH에 RAISERROR를 래핑하는 경우 방금 발생한 예외를 포착하지 않겠습니까? –

+0

변수 값을 "New"보다 높게 설정하면 코드가 catch 블록으로 건너 뜁니다. Return 키 워드는 이후 코드 실행을 중지시킵니다. –

+0

RETURN 문은 코드가 오류를 발생시키고 제어가 CATCH 블록으로 이동 한 지점 이후이므로 RETURN 문은 실행되지 않을 것이라고 생각합니다. (그러나 END CATCH가 프로 시저의 끝인 경우 효과는 동일합니다.) –