0

特定の条件に基づいて、Sybase ASE データサーバーでパスワードのリセットを実行する必要があります。

if validations_here
begin
    exec sp_password 'sso_passw', 'new_passw', @userid
end

sp_password10316 - "提供された新しいパスワードは以前のパスワードと同じです"などのエラーが発生する可能性があります。ドキュメンテーションは見つかりませんでしたが、致命的なエラーではなく、 でエミュレートできるはずだと思いますraiserror

呼び出し側はその方が扱いやすいので、エラーコードを取得して結果セットの一部として返したいので、@@error を SELECT することを考えました。私のコードは次のとおりです(問題に関連すると思われる部分のみを転写しました):

create procedure sp_desbloc_blanqueo_usr    
    @userid sysname,        
    @sso_pass varchar(20),  
    @new_pass varchar(20)   
as
begin
    declare @ret_code int
    declare @ret_msg varchar(100)
    declare @myerror int

    select @ret_code = 0, @ret_msg = 'OK'

    exec sp_password @sso_pass, @new_pass, @userid
    set @myerror = @@error 
    if @myerror <> 0
    begin
        select @ret_code = @myerror, @ret_msg = 'Error occurred changing password' 
        -- It would be nice to have the actual error message as well
        goto fin
    end

    fin:
    select @ret_code as ret_code, @ret_msg as ret_msg
end

ただし、ストアド プロシージャを実行するたびに、0 asret_codeと OK asを取得しret_msgます (パラメーター tosp_passwordが間違っていても)。

sp_passwordストアド プロシージャからのエラー コードを「キャッチ」するにはどうすればよいですか?

4

1 に答える 1

1

多くの "sp_" ストアド プロシージャは、問題が発生したときにゼロ以外のリターン コードを設定します。通常、ストアド プロシージャ内で発生したエラーをキャッチしようとするよりも、このリターン コードを処理する方が適切です。IIRC、このキャッチは Transact-SQL では不可能です。C などの第 3 世代言語が必要になります。

myproc ストアド プロシージャのリターン コードを変数 @myvar に取得するための構文は次のとおりです。

exec @myvar = myproc [arguments] 

sp_password を使用した簡単な例:

declare @spreturn int  
exec @spreturn = sp_password 'notmyoldpw', 'notmynewpw'  
print "Return from sp_password is %1!", @spreturn  
go

Server Message:  Number  10315, Severity  14  
Server 'SDSTRHA01_SY01', Procedure 'sp_password', Line 148:  
Invalid caller's password specified, password left unchanged.  
Server Message:  Number  17720, Severity  16  
Server 'SDSTRHA01_SY01', Procedure 'sp_password', Line 158:  
Error:  Unable to set the Password.  
(1 row affected)  
Return from sp_password is 1  
(return status = 1)  

最初の行で定義された int 変数 @spreturn が sp_password リターン コードを取得しました。その値は、最後のメッセージ行の (return status = 1) で示されているものです。ゼロではない理由は明らかです。sp_password 内に 10315 と 17720 の 2 つのエラーがありました。ポイントは、このゼロ以外のリターン コードに注目し、10315 と 17720 を無視することです。ストアド プロシージャでは、@spreturn をゼロに対してチェックする必要があります。 . ゼロの場合は正常に実行され、それ以外の場合は何かが失敗しました。

于 2015-10-26T20:10:34.097 に答える