3

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

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

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

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

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

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

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

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

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

+0

Найдите аналогичную проблему с дополнительной информацией о том, какая проблема может быть здесь: http://stackoverflow.com/questions/605996/ms-sql-suppress-return-value-of-stored-procedure-called-in -stored-procedure – BlaM 2009-03-03 11:20:06

ответ

0

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

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

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

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

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

+0

Наконец-то я смог реализовать этот код. Я вызвал вызов SPROC2 из ASP. ВСЕ ЕЩЕ ОШИБКИ! Я просмотрел код для NOCOUNT и PRINT (и что-нибудь еще, что даст результат), но безрезультатно. Я закончил писать хак, потому что число ошибок = 0 последовательно. – Aaron 2008-09-23 04:40:21

1

Вы можете страдать от проблемы double-hop problem

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

Выдача дубликатов Windows NT Challenge/Response does not support (в том случае, когда он был передан серверу IIS, те же учетные данные не могут быть переданы на серверный сервер для аутентификации).

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

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

Другие ресурсы:

0

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

0

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

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

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

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

0

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

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

3

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

0

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

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

0

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

1

У меня была аналогичная проблема, и я решил ее, установив nocount и удалив команды печати.

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

  • Нет связанных вопросов^_^