2011-08-10 6 views
3

발신자가 주어진 params로이 sproc을 호출 할 권한이 있는지를 확인하는 sproc가 있습니다. 발신자가 승인되지 않은 경우 RAISERROR에 ACCESS DENIED 오류 번호가 표시됩니다. 오류 번호가 50000보다 커야하기 때문에 오류 번호 10011 (sys.messages에서 거부 됨)이 될 수 없습니다. sp_addmessage sproc을 사용하여 동일한 메시지 (영어 및 지역화 된 텍스트도 추가하고 싶지 않음)를 추가하고 싶지 않습니다. 동일한 ACCESS DENIED 오류를 다시 작성하십시오. 이 작업을 수행하는 올바른 방법은 무엇입니까?RAISERROR를 사용하여 ACCESS DENIED 오류를 나타냅니다.

편집 : 필요한 SQL 코드가 SQL 애저와 호환 있어야 이후, 나는 오류 번호 RAISERROR를 호출하고 뒤에 코드에서 기본 50,000 오류 코드를 검사 결국는 (SQL 애저 현재에 대한 지원이 없다 sp_addmessagesys.messages).

답변

1

Access denied 오류가 있지만, 오히려 Access denied with these parameters 오류가 아닙니다. 따라서 사용자 정의 오류를 생성하고이를 발생시켜야합니다.

"실제"액세스 거부 오류가 발생하면 프로 시저에 대한 exec 권한을 취소해야합니다.

2

AccessDeniedTable 테이블을 생성하면 현재 DB 사용자는 절대로 액세스 할 수 없습니다. 당신이 논리 ACCESS DENIED 조건을 SELECT @x=COUNT(*) FROM AccessDeniedTable에 부딪혔을 때 실제 오류를 던질 것입니다. 당신은 당신이 인상 원하는대로이 작업을 수행 할 수 없습니다

IF @Accesslevel<5 ---your condition here 
BEGIN 
    SELECT @x=COUNT(*) FROM AccessDeniedTable --throw standard ACCESS DENIED error 
    RAISERROR('FATAL ERROR',16,1) --just in case actual error is not thrown 
    RETURN 999999 --just in case 
END 
+1

이렇게하면 "System.Data.SqlClient.SqlException : SELECT 권한이 'AccessDeniedTable'데이터베이스 'FOO', 스키마 'dbo'에 대해 거부되었습니다."라는 잘못된 청어 오류 메시지가 표시됩니다. 전혀 바람직하지 않다. – kateroh

+0

@kateroh,이 아이디어를 사용하시오. 그러나'select ... '를 의도 한 시스템 메시지를 일으키는 것으로 변경하십시오. –

관련 문제