1

SQL Server(バージョン10.0.1600)には、自分で作成したストアドプロシージャがあります。

エラーはスローされず、データベースに挿入した後、正しい値が返されます。

ただし、最後のコマンドspSendEventNotificationEmail(電子メール通知を送信する)は実行されていません。

同じデータを使用してスクリプトを手動で実行するspSendEventNotificationEmailと、通知が表示されるので、機能することがわかります。

ストアドプロシージャでの呼び出し方法に問題がありますか?

[dbo].[spUpdateRequest](@packetID int, @statusID int output, @empID int, @mtf nVarChar(50)) AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @id int
    SET @id=-1
    -- Insert statements for procedure here
    SELECT A.ID, PacketID, StatusID
    INTO #act FROM Action A JOIN Request R ON (R.ID=A.RequestID)
    WHERE (PacketID=@packetID) AND (StatusID=@statusID)

    IF ((SELECT COUNT(ID) FROM #act)=0) BEGIN -- this statusID has not been entered. Continue

        SELECT ID, MTF
        INTO #req FROM Request
        WHERE PacketID=@packetID

        WHILE (0 < (SELECT COUNT(ID) FROM #req)) BEGIN
            SELECT TOP 1 @id=ID FROM #req
            INSERT INTO Action (RequestID, StatusID, EmpID, DateStamp)
            VALUES (@id, @statusID, @empID, GETDATE())
            IF ((@mtf IS NOT NULL) AND (0 < LEN(RTRIM(@mtf)))) BEGIN
                UPDATE Request SET MTF=@mtf WHERE ID=@id
            END
            DELETE #req WHERE ID=@id
        END
        DROP TABLE #req

        SELECT @id=@@IDENTITY, @statusID=StatusID FROM Action

        SELECT TOP 1 @statusID=ID FROM Status
        WHERE (@statusID<ID) AND (-1 < Sequence)

        EXEC spSendEventNotificationEmail @packetID, @statusID, 'http:\\cpweb:8100\NextStep.aspx'

    END ELSE BEGIN

        SET @statusID = -1

    END

    DROP TABLE #act

END

データテーブルがどのように接続されているかについてのアイデア:

私のデータベース

4

1 に答える 1

2

あなたのコメントから、主に C# 開発を行っていることが分かります。基本的なテストは、期待どおりの引数で sproc が呼び出されることを確認することです。

PRINT '@packetID: ' + @packetID
PRINT '@statusID: ' + @statusID
EXEC spSendEventNotificationEmail @packetID, @statusID, 'http:\\cpweb:8100\NextStep.aspx'

このようにして、1. exec ステートメントに到達したことがわかります 2. 正確な値

これがすべて機能する場合、sproc を実行する権限があり、それを呼び出す (C#?) コードが権限を持っていないことが非常に良い候補です。エラーがスローされるのは難しいと思います。

EXEC が正常に実行されるかどうかを確認する簡単なテストは、その後にダミー テーブルに挿入することです。

更新 1

PRINT ステートメントを追加することを提案しましたが、実際にあなたが言うように、C# から (簡単に) キャッチすることはできません。できることは、新しく作成したログ テーブルに 2 つの変数を挿入することです。このようにして、C# の実行から流れる正確な値を知ることができます。

アクセス許可を追加すると機能するようになった理由については、すぐに答えられません。SQL セキュリティも透過的ではありません。しかし、自分自身をさらに研究することは良いことです。ゲストとパブリックの両方を追加する必要がありますか? また、spSendEventNotificationEmail の内部で何が起こっているかを確認するのにも役立ちます。sproc が以前にアクセス許可を持っていなかったリソースを使用している可能性は十分にあります。これは、テーブルまたは別の sproc のようなオブジェクトである可能性があります。セキュリティはコンテキスト/設定に大きく依存しており、SO のような Q/A サイトで取り組むのは簡単な問題ではありません。

于 2012-06-21T21:57:14.467 に答える