sql server - pasar - Problema al llamar al procedimiento almacenado desde otro procedimiento almacenado a través de ASP clásico
procedimiento almacenado sql server insert (9)
¿Cómo está configurado su servidor vinculado? Por lo general, tiene algunas opciones sobre cómo se autentica en el servidor remoto, lo que incluye iniciar sesión como usuario actualmente conectado o especificar un inicio de sesión de SQL para usar siempre. ¿Has intentado configurarlo para usar siempre una cuenta específica? Eso debería eliminar cualquier posible problema de permisos al llamar al procedimiento remoto ...
Tenemos una aplicación ASP clásica que simplemente funciona y nos ha aborrecido modificar el código para que no invoquemos la ira de algunos dioses griegos muertos desde hace mucho tiempo.
Recientemente tuvimos el requisito de agregar una función a una aplicación. La implementación de funciones es realmente solo una operación de base de datos que requiere un cambio mínimo en la IU.
Cambié la UI e hice la modificación menor para enviar un nuevo valor de datos a la llamada sproc (sproc1).
En sproc1 que se llama directamente desde ASP, agregamos una nueva llamada a otro sproc que está ubicado en otro servidor, sproc2.
De alguna manera, esto no funciona a través de nuestra aplicación ASP, pero funciona en SQL Management Studio.
Aquí están los detalles técnicos:
- SQL 2005 en ambos servidores de bases de datos.
- El inicio de sesión Sql se está autenticando desde la aplicación ASP a SQL 2005 Server 1.
- El servidor vinculado del Servidor 1 al Servidor 2 está funcionando.
- Al ejecutar sproc1 desde SQL Management Studio, funciona bien. Incluso cuando está acreditado como el mismo usuario que usa nuestro código (la aplicación sql de inicio de sesión).
- sproc2 funciona cuando se llama independientemente de sproc1 desde SQL Management Studio.
- VBScript (ASP) captura un error que se emite en el XML de vuelta al cliente. El número de error es 0, la descripción del error está en blanco. Tanto desde el objeto ADODB.Connection como desde cualquier Err.Number / Err.Description se obtiene en VBScript desde el lado ASP.
Entonces, sin ningún error ni reproducibilidad (es decir, a través de SQL Mgmt Studio), ¿alguien sabe el problema?
Nuestro plan actual es desglosar y profundizar en el código en el lado de ASP y hacer una llamada completamente separada al Servidor 2.sproc2 directamente desde ASP en lugar de tratar de usar Piggy-Back a través de sproc1.
¿Has configurado nocount en el set en ambos procedimientos almacenados? Tuve un problema similar una vez y aunque no recuerdo exactamente cómo lo resolví en este momento, ¡sé que eso tuvo algo que ver!
¿Puedo verificarlo: usted hizo la adición de sproc2? Antes de eso, funcionaba bien durante años.
¿No podría cambiar dónde llama a sproc2? En lugar de llamarlo desde dentro de sproc1, ¿puedes llamarlo desde la ASP? De esta forma, usted controla la autenticación a SQL en el código y no tiene que depender de la configuración de confianzas o autenticación remota compartida en los servidores.
Consideré eso (doble salto), pero ¿cuál es la diferencia entre una llamada sproc-in-a-sproc como me refiero a una típica combinación de servidor cruzado a través de INNER JOIN? Ambos se ejecutarían en el Servidor1, usando las credenciales del Servidor Vinculado y autenticando al Servidor 2.
¿Alguien puede confirmar que llamar a un servidor cruzado de sproc es diferente a hacer una combinación en tablas de datos? ¿Y por qué?
Si la configuración del Servidor Vinculado es una cuenta sql, ¿eso se considera un doble salto (dado que lo que usted llama es doble salto de NTLM?)
En términos de si los resultados múltiples están volviendo - no. Tanto Server1.Sproc1 como Server2.Sproc2 serían "ExecuteNonQuery ()" en el mundo .net y no devolverían nada (sin resultados ni valores devueltos).
El código de ejemplo podría ayudar :) ¿Está tratando de devolver dos tablas del procedimiento almacenado; No creo que ADO 2.6 pueda manejar el retorno de varias tablas.
Intente verificar los permisos de la base de datos para el usuario especificado en la cadena de conexión. Use el mismo nombre de usuario en la cadena de conexión para iniciar sesión en la base de datos mientras usa sql mgmt studio.
cree una tabla temporal para escribir los valores intermedios y las excepciones, ya que puede ser una forma efectiva de depurar su aplicación.
Mi primera reacción es que esto podría no ser una cuestión de llamar a varios servidores, sino de llamar a un segundo proceso desde el principio, y que esto podría ser lo que está actuando de manera diferente en los dos entornos diferentes.
Mi primera pregunta es esta: ¿qué sucede si elimina el aspecto de servidor cruzado de la ecuación? Si pudieras configurar un sistema de prueba donde tu primer proc llama a tu segundo proc, pero el segundo proc está en el mismo servidor y / o en la misma base de datos, ¿sigues teniendo el mismo problema?
En esta misma línea: en mi experiencia, cuando la aplicación y el SSMS obtuvieron resultados diferentes como ese, a menudo ha sido un problema de la configuración de los procedimientos almacenados. Podría ser, como dice Luke, NOCOUNT. He tenido este tipo de cosas a partir de las declaraciones de IMPRESIÓN extrañas en el código, aunque parezco recordar que el valor IMPRESO forma parte de la descripción del error (muy contrario a la intuición).
Si se devuelve algo en la ventana Mensajes cuando ejecuta esto en SSMS, averigüe de dónde viene y hágale detenerse. Tendría que buscar los términos técnicos, pero mi recuerdo es que los diferentes entornos de consulta tienen sensibilidades diferentes a los "errores", y que una conexión predeterminada a través de SSSM no arrojará un error en ciertos momentos cuando una conexión ADO desde un lenguaje de scripting .
Un último pensamiento: en caso de que sea algo relacionado con el entorno, pruebe diferentes configuraciones en la cadena de conexión de su página ASP. Por ejemplo, si tiene una conexión OLEDB, intente con ODBC. Pruebe los controladores de SQL Server nativos y no nativos. Consulte las opciones de cadena de conexión que admite su proveedor y pruebe cualquiera de ellas que parezca que valdría la pena intentar.
Podrías estar sufriendo el problema del doble salto
El problema del doble salto es cuando la página ASP / X intenta usar recursos que se encuentran en un servidor que es diferente del servidor IIS.
El Desafío / Respuesta de Windows NT no admite suplantaciones de doble salto (ya que una vez pasadas al servidor IIS, las mismas credenciales no se pueden pasar a un servidor de fondo para la autenticación).
Debe verificar la segunda conexión intentada usando el Analizador de SQL.
Tenga en cuenta que con sus pruebas manuales no se está autenticando a través de IIS. Solo cuando inicia el sql a través de la página ASP / X se manifiesta este problema.
Más recursos:
Tuve un problema similar y lo resolví configurando nocount y eliminando los comandos de impresión.