2010-08-19 28 views
5

Recibí un ticket hoy en relación con una aplicación rota que fue causada por un procedimiento almacenado roto.Procedimiento almacenado roto guardado

El procedimiento almacenado ha estado funcionando durante unos meses, pero hoy cuando lo examiné encontré algunos errores.

primero hubo una consulta como esta.

SELECT a.a , b.b , a.b de la Tabla1 un JOIN Tabla2 b ON. a.a = b.a

el período posterior al "ENCENDIDO" obviamente causó el error. La reparación fue fácil, pero hasta donde yo sé, no puede guardar un procedimiento almacenado que está roto. De hecho, cuando abrí el procedimiento almacenado, (sin modificarlo) y traté de ejecutar el alter con el código de allí, falló con los mensajes de error.

Hubo otros errores como este a través del procedimiento almacenado que arreglé para finalmente ejecutar la modificación.

No entiendo cómo esto es posible, y me gustaría saber qué podría cambiar y guardar un procedimiento almacenado que está roto. Por lo que me han dicho que no ha habido ningún cambio en el servidor, y como mencioné antes, este procedimiento almacenado ha estado funcionando durante los últimos meses

Parece que estoy cazando un fantasma, y Cualquier información será muy apreciada.

+1

ejecute el nombre de selección, create_date, modified_date, * de sys.procedures y descubra cuándo se creó el procedimiento en la base de datos. Verifique que no haya cambiado. –

Respuesta

7

Supongo que se trata de una cuestión de resolución diferida de nombres.

SQL Server le permitirá crear procedimientos que hacen referencia a objetos que no existen en el momento de la creación del procedimiento almacenado. En este caso, SQL elige diferir la compilación de la consulta al tiempo de ejecución, confiando en que el objeto estará allí cuando se llame al procedimiento, por lo tanto, la sintaxis no se verifica cuando se crea el procedimiento.
Si cuando el procedimiento se ejecuta posteriormente, la sintaxis es incorrecta, obtendrá un error en ese punto, pero no durante la creación del procedimiento.

Por ejemplo, si tabla1 y tabla2 no existen, esta declaración se completará sin error:

CREATE PROCEDURE testproc AS 
SELECT a.a 
     , b.b 
     , a.b 
FROM table1 a 
     JOIN table2 b ON. a.a = b.a 

Cuando vaya a ejecutar TestProc, obtendrá el siguiente error: "El multi-parte el identificador ".aa" no se pudo enlazar ".

+0

+1. Nunca me había dado cuenta de eso. El día todavía es joven y ya aprendí algo. –

+0

En realidad, me encontré con una situación de esta situación unos días más tarde, donde "I" creó un procedimiento almacenado con una tabla temporal. Aunque todavía no he descubierto cómo ese procedimiento almacenado cambió/se rompió sin previo aviso, ahora hice algunas copias de seguridad y espero que esto no vuelva a suceder. –

+0

Entonces, con respecto al "¿cómo sucedió esto?" pregunta, ¿has probado los informes integrados? SQL 2K5 y 2K8 tienen un rastreo predeterminado ejecutándose en segundo plano que captura todos los cambios de objetos en el servidor. Los cambios son visibles a través del informe del historial de cambios del esquema en el servidor o en el nivel de la base de datos. Simplemente haga clic con el botón derecho en la base de datos en cuestión, seleccione Informes -> Informes estándar -> Historial de cambios de esquema.La cantidad de historial disponible dependerá de la cantidad de actividad que haya habido, pero SQL Server mantiene 5 archivos de rastreo en línea. Se transfieren a 20 MB o reinicio del servidor, lo que ocurra primero. –

Cuestiones relacionadas