Проблема вызова хранимой процедуры из другой хранимой процедуры через классический ASP - PullRequest
3 голосов
/ 20 сентября 2008

У нас есть классическое приложение ASP, которое просто работает, и мы не хотим модифицировать код, чтобы не вызвать гнев некоторых давно умерших греческих богов.

У нас недавно было требование добавить функцию в приложение. Реализация функции - это просто операция с базой данных, требующая минимального изменения пользовательского интерфейса.

Я изменил пользовательский интерфейс и внес небольшие изменения, чтобы передать новое значение данных вызову sproc (sproc1).

В sproc1, который вызывается напрямую из ASP, мы добавили новый вызов другому sproc, который, как оказалось, расположен на другом сервере, sproc2.

Почему-то это не работает через наше приложение ASP, но работает в SQL Management Studio.

Вот технические данные:

  1. SQL 2005 на обоих серверах баз данных.
  2. Sql Логин аутентифицируется из приложения ASP на SQL 2005 Server 1.
  3. Работает связанный сервер с Сервера 1 на Сервер 2.
  4. При выполнении sproc1 из SQL Management Studio - работает нормально. Наш код использует даже учетные данные того же пользователя (приложение sql login).
  5. sproc2 работает при вызове независимо от sproc1 из SQL Management Studio.
  6. VBScript (ASP) фиксирует ошибку, которая передается в XML обратно клиенту. Номер ошибки 0, описание ошибки пустое. Как из объекта ADODB.Connection, так и из того, что Err.Number / Err.Description дает в VBScript со стороны ASP.

Таким образом, без каких-либо ошибок или воспроизводимости (т. Е. Через SQL Mgmt Studio) - кто-нибудь знает проблему?

Наш текущий план состоит в том, чтобы разобраться в коде на стороне ASP и сделать совершенно отдельный вызов Server 2.sproc2 напрямую из ASP, а не пытаться прокрутить sproc1.

Ответы [ 9 ]

3 голосов
/ 20 сентября 2008

У вас есть установить nocount на , установленный в обеих хранимых процедурах? Однажды у меня была похожая проблема, и хотя я не могу точно вспомнить, как я ее решил на данный момент, я знаю, что это как-то связано!

1 голос
/ 22 января 2009

У меня была похожая проблема, и я решил ее, включив nocount и удалив команды печати. ​​

1 голос
/ 20 сентября 2008

Возможно, вы страдаете от проблемы двойного прыжка

Проблема двойного перехода заключается в том, что страница ASP / X пытается использовать ресурсы, расположенные на сервере, который отличается от сервера IIS.

Вызов / ответ Windows NT не поддерживает олицетворения двойного прыжка (при его передаче на сервер IIS одни и те же учетные данные нельзя передавать на внутренний сервер для проверки подлинности).

Вы должны проверить попытку второго соединения, используя SQL Profiler.

Обратите внимание, что при ручном тестировании вы не проходите аутентификацию через IIS. Только когда вы запускаете sql через страницу ASP / X, эта проблема проявляется.

Дополнительные ресурсы:

0 голосов
/ 21 сентября 2008

Моя первая реакция заключается в том, что это может быть проблема не вызова кросс-сервера, а одного вызова второго процесса из первого, и что этот может действовать по-разному в двух разных средах. ,

Мой первый вопрос: что произойдет, если вы удалите межсерверный аспект из уравнения? Если бы вы могли настроить тестовую систему, где ваш первый процесс вызывает ваш второй процесс, но второй процесс находится на том же сервере и / или в той же базе данных, у вас все еще возникает та же проблема?

В том же духе: по моему опыту, когда приложение и SSMS получали разные результаты, это часто было проблемой настроек хранимых процедур. Это может быть, как говорит Люк, NOCOUNT. Такое случалось с посторонними утверждениями PRINT в коде, хотя я, кажется, помню, что значение PRINT стало частью описания ошибки (очень нелогично).

Если что-нибудь возвращается в окне сообщений при запуске в SSMS, выясните, откуда оно поступает, и остановите его. Мне бы пришлось поискать технические термины, но я помню, что разные среды запросов имеют разную чувствительность к «ошибкам», и что соединение по умолчанию через SSSM не будет выдавать ошибку в определенные моменты времени, когда соединение ADO из языка сценариев будет .

Одна заключительная мысль: если это среда, попробуйте другие параметры в строке подключения вашей ASP-страницы. Например, если у вас есть соединение с OLEDB, попробуйте ODBC. Попробуйте родные и не родные драйверы SQL Server. Посмотрите, какие параметры строки подключения поддерживает ваш провайдер, и попробуйте любой из них, который, возможно, стоит попробовать.

0 голосов
/ 20 сентября 2008

Как настроен ваш связанный сервер? Как правило, у вас есть несколько вариантов того, как он аутентифицируется на удаленном сервере, включая вход в систему в качестве текущего пользователя, вошедшего в систему, или указание имени входа SQL для постоянного использования. Вы пытались настроить его, чтобы всегда использовать конкретную учетную запись? Это должно устранить любые возможные проблемы с разрешениями при вызове удаленной процедуры ...

0 голосов
/ 20 сентября 2008

Могу я просто проверить: вы сделали добавление sproc2? До этого он работал нормально целую вечность.

Не могли бы вы изменить, откуда вы вызываете sproc2? Вместо того, чтобы вызывать его изнутри sproc1, вы можете вызвать его из ASP? Таким образом, вы управляете аутентификацией SQL в коде, и вам не нужно полагаться на настройку доверия или разделяемой удаленной аутентификации на серверах.

0 голосов
/ 20 сентября 2008

Попробуйте проверить права доступа к базе данных для пользователя, указанного в строке подключения. Используйте то же имя пользователя в строке подключения для входа в базу данных при использовании sql mgmt studio.

создайте временную таблицу для записи промежуточных значений и исключений, поскольку это может быть эффективным способом отладки вашего приложения.

0 голосов
/ 20 сентября 2008

Я учел это (двойной переход), но в чем разница между вызовом sproc-in-a-sproc, как я имею в виду, и типичным межсерверным соединением через INNER JOIN? И то, и другое будет выполнено на сервере Server1 с использованием учетных данных связанного сервера и аутентификацией на сервере 2.

Может ли кто-нибудь подтвердить, что вызов кросс-сервера sproc отличается от соединения таблиц данных? А почему?

Если конфигурация связанного сервера представляет собой учетную запись sql - считается ли это двойным прыжком (поскольку то, на что вы ссылаетесь, является двойным прыжком NTLM?)

С точки зрения того, возвращается ли несколько наборов результатов - нет. И Server1.Sproc1, и Server2.Sproc2 будут «ExecuteNonQuery ()» в мире .net и не будут возвращать ничего (без наборов результатов и без возвращаемых значений).

0 голосов
/ 20 сентября 2008

Пример кода может помочь :) Вы пытаетесь вернуть две таблицы из хранимой процедуры; Я не думаю, что ADO 2.6 может обрабатывать несколько возвращаемых таблиц.

...