code

다양한 RAISERROR 심각도 수준은 무엇을 의미합니까?

codestyles 2020. 11. 5. 08:01
반응형

다양한 RAISERROR 심각도 수준은 무엇을 의미합니까?


내 최고의 Google 결과는 다음과 같습니다.

  • 11 미만은 오류가 아니라 경고입니다.
  • 11-16을 사용할 수 있습니다.
  • 16 이상은 시스템 오류입니다.
  • 11-16 사이에는 행동 차이가 없습니다.

그러나 BOL에서는 "모든 사용자가 0에서 18까지의 심각도 수준을 지정할 수 있습니다."

내 특정 저장 프로 시저에서 오류가 .Net 클라이언트 응용 프로그램에 반환되기를 원하므로 11-18 사이의 심각도 수준이 트릭을 수행하는 것처럼 보입니다. 누구든지 각 레벨의 의미와 사용 방법에 대한 권위있는 정보를 가지고 있습니까?


데이터베이스 엔진 심각도 수준

16을 반환해야합니다. 가장 많이 사용되는 기본 오류 수준입니다.

사용자가 수정할 수있는 일반적인 오류를 나타냅니다.

17-18을 반환하지 마십시오. 리소스 문제와 같은 더 심각한 오류를 나타냅니다.

사용자가 수정할 수없는 소프트웨어 오류를 나타냅니다. 시스템 관리자에게 문제를 알리십시오.

또한 11-15는 각 레벨에 특별한 의미가 부여되어 있기 때문에 반환하지 마십시오 (14-보안 액세스, 15-구문 오류, 13-교착 상태 등).

레벨 16은 실행을 종료하지 않습니다.

경고를 기록하고 실행을 계속하려는 경우 10 미만의 심각도 수준을 대신 사용하십시오.


심각도 수준 16 실행 종료 할 수 있습니다 .

RAISERROR ()를 사용한 TRY-CATCH 경고 :

RAISERROR()Severity가 16 이면 문제가되는 줄 아래의 모든 항목에 대한 실행이 종료됩니다.
그러나 이것은 Try-Block 내부 에서만 적용됩니다.

--DECLARE @DivideByZero Int = 1/0--Uncommenting this will Skip everything below.
RAISERROR (N'Before Try: Raise-Error 16.', 16, 0)--Works.
SELECT 'Before Try: Select.'[Marker]--Works.
BEGIN TRY
    RAISERROR (N'Inside Try: Raise-Error 16.', 16, 0)--Not displayed,but sends to Catch-Block.
    SELECT 'Inside Try: Select.'[Marker]--Skipped.
END TRY
BEGIN CATCH
    RAISERROR (N'Inside Catch: Raise-Error 16.', 16, 0)--Works.
    SELECT 'Inside Catch: Select.'[Marker]--Works.
    --RETURN --Adding Return will only skip what is After the Catch-Block for this scope only.
    --;THROW--Shows the RAISERROR() from the Try-Block and Halts Execution. Must include ";".
END CATCH
RAISERROR (N'After Try-Catch: Raise-Error 16.', 16, 0)--Works.
SELECT 'After Try-Catch: Select.'[Marker]--Works.

놀랐나요?
나도 그렇다. 루프를 위해 나를 던진 것은 모든 Severity- 16 이 동일 하지 않다는 것 입니다.
맨 위에있는 Divide-By-Zero 줄의 주석 처리를 제거하면 그 아래에 아무것도 실행되지 않습니다.
분할 0으로 논리는 것 또한 Severity- 생성 16 예외,
  그러나 그것은으로 처리됩니다 전체 스톱 으로 발생하는 경우와는 달리 RAISERROR().

참고 : Try-Block에 의해 트리거 된 이벤트에            대해 SQL 예외 를 올바르게 처리하려면 Catch-Block 내부 ;THROW마지막 줄로 사용하십시오 .            이렇게하면 완전히 중단 된 상태로 실행이 효과적으로 중단됩니다. 다른 라인을 호출하기 전에 캐치 블록에 존재하는 경우 세미콜론이 필요합니다 . 당신의 논리가 제대로 캐치 블록에서 오류를 처리 (당신이 처리를 계속하려는 경우   그 이후의 로직의 나머지 부분을), 다음 않습니다 하지 사용 .
RAISERROR()

;;THROW

;THROW

결론:

Do not conflate a Severity-16 thrown by the SQL-Server-Engine
  with one you raise yourself using RAISERROR().
For all intents and purposes (when deliberately throwing your own errors), consider only 2 Severities:
    0 (for Informational or Warning) and
  16 (for Throwing an Exception handled within a Try-Block - to kick it out to the Catch-Block).

Information Now!

Note: If you are using RAISERROR() to display Informational Messages,
           then I suggest using WITH NOWAIT:

RAISERROR('Read me right now!', 0, 1) WITH NOWAIT
RAISERROR('Read me whenever.' , 0, 1)
DECLARE @WaitSeconds Int = 10
DECLARE @WaitFor DateTime = DATEADD(SECOND, @WaitSeconds, 0)
WAITFOR DELAY @WaitFor

This is especially useful during long batch operations when you'd like some insight
  into how things are progressing as you reach certain milestone markers throughout the batch.
By not using WITH NOWAIT, you may never know when your Informational Messages might appear.
They could appear intermittently throughout the course of the batch, or all at once when the batch completes.

참고URL : https://stackoverflow.com/questions/1122925/what-do-the-different-raiserror-severity-levels-mean

반응형