2012-06-21 2 views
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 ([email protected]) AND ([email protected]) 

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

     SELECT ID, MTF 
     INTO #req FROM Request 
     WHERE [email protected] 

     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 [email protected] WHERE [email protected] 
      END 
      DELETE #req WHERE [email protected] 
     END 
     DROP TABLE #req 

     SELECT @[email protected]@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 

Идея о том, как данные таблицы связаны:

my database

+1

Возможно, вы могли бы переписать почти все его на основе набора. Также 'TOP 1' без заказа и' @@ IDENTITY' выглядят подозрительными. Что делает 'spSendEventNotificationEmail'? В конечном итоге вызывает вызов 'sp_send_dbmail', если это может быть проблема с правами доступа? Вы проверяете возвращаемое значение этой процедуры? –

+0

Кажется правильным. Это может быть проблема с правами доступа из-за того, что пользователь вызывает внешнюю хранимую процедуру? –

+0

ОК, я разработчик C#, а не парень SQL. Я действительно не знаю, что этот * установлен на основе пути *, но я открыт для ввода. Также, как я могу проверить разрешения? Обе процедуры расположены на одном сервере и в той же базе данных. – jp2code

ответ

2

Из ваших комментариев я получаю вы в основном разработки C#. Основной тест, чтобы убедиться, sproc вызываются с теми же самыми аргументами вы ожидаете

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

Таким образом, вы знаете, что 1. ехес оператор достиг 2. точных значений

Если это все работает чем я очень хороший кандидат, так это то, что у вас есть разрешение на запуск sproc и вашего (C#?) кода, который его вызывает. Я ожидаю, что ошибка будет сложной.

Быстрый тест, чтобы убедиться, что EXEC выполнен правильно, - это сделать вставку в фиктивный стол после него.

Update 1

Я предложил добавить операторы печати, но на самом деле, как вы говорите, вы не можете (легко) поймать их от C#. Что вы можете сделать, так это вставить две переменные в таблицу журналов, которую вы недавно создали. Таким образом, вы знаете точные значения, которые вытекают из выполнения C#.

Что касается того, почему он теперь работает, если вы добавляете разрешения, я не могу дать вам готовый ответ. Безопасность SQL также не прозрачна для меня. Но все же полезно исследовать себя, но дальше. Вам нужно добавить гостей и? Это также поможет узнать, что происходит внутри spSendEventNotificationEmail. Скорее всего, sproc использует ресурс, на котором раньше не было разрешения. Это может быть объект, похожий на таблицу или, возможно, другой sproc. Безопасность в значительной степени зависит от контекста/настроек и не является легкой проблемой для решения проблемы с сайтом Q/A, например SO.

+0

Я вызываю хранимую процедуру 'spUpdateRequest' из моего кода, поэтому Я не уверен, как увидеть, что возвращают утверждения 'PRINT'. Если это помогает, мой код изначально вызывал 'spSendEventNotificationEmail' после выполнения запроса на обновление, но было логичнее, чтобы исходный вызов выполнял вторичный вызов. Если я не смогу заставить его работать, я вернусь к своей старой технике. – jp2code

+0

Я не знаю, как сделать некоторые вещи, которые вы предлагаете, buckley, и я не понимаю, почему процедура обновления работает, когда у нее нет профилей, предоставленных для ее выполнения. Однако я добавил два аккаунта 'guest' и' public' в сценарий электронной почты, и теперь он работает. Я просто не понимаю, почему **. – jp2code

+1

Добавил обновление моего ответа. Не ясный ответ, но, возможно, это помогает. – buckley

Смежные вопросы