2010-08-19 15 views
5

ho ricevuto un biglietto di oggi riguardante una domanda di rotta che è stato causato da una stored procedure rotto.Salvati rotto stored procedure

La stored procedure aveva lavorato per un paio di mesi, ma oggi quando ho esaminato ho trovato un paio di bug.

prima c'era una query come questa.

SELEZIONA a.a , b.b , a.b FROM tabella1 un JOIN table2 b ON. a.a = b.a

il periodo dopo il "ON", ovviamente, ha causato l'errore. fissandola è stato facile, ma per quanto ne so, non è possibile salvare una stored procedure che è rotto. Infatti, quando ho aperto la procedura memorizzata, (senza modificarla) e provato a fare funzionare il alterare con il codice da lì, non è riuscito con i messaggi di errore.

Ci sono stati altri errori di questo tipo attraverso la stored procedure che ho fissato per eseguire finalmente l'alter.

Non capisco come questo sia possibile, e vorrei sapere che cosa potrebbe cambiare e salvare una stored procedure che è rotto. Da quanto mi è stato detto non ci sono state modifiche al server, e come ho accennato prima questa procedura memorizzata aveva funzionato negli ultimi mesi

Sembra di andare a caccia di un fantasma, e Qualsiasi informazione sarà ben apprezzata.

+1

corsa select nome, create_date, MODIFIED_DATE, * da sys.procedures e scoprire quando il procedimento è stato creato il DB. Controlla che non sia stato cambiato. –

risposta

7

Sto indovinando questo è un problema di risoluzione dei nomi differita.

SQL Server vi permetterà di creare procedure che fanno riferimento a oggetti che non esistono al momento della creazione stored procedure. In questo caso, SQL sceglie di posticipare la compilazione della query in runtime, ritenendo che l'oggetto sarà lì nel momento in cui viene chiamata la procedura, quindi la sintassi non viene verificata quando viene creata la procedura.
Se quando la procedura viene successivamente eseguita la sintassi non è corretta, si otterrà un errore in quel punto, ma non durante la creazione procedura.

Per esempio, se tabella1 e tabella2 non esistono, questa affermazione si completerà senza errori:

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

Quando si va ad eseguire testproc, si otterrà il seguente errore: "Il multi-parte identificatore ".aa" non può essere associato. "

+0

+1. Non l'ho mai notato. La giornata è ancora giovane e ho già imparato qualcosa. –

+0

In realtà ho avuto un problema in questa situazione alcuni giorni dopo, dove "I" ha creato una stored procedure con una tabella temporanea. Anche se non ho ancora capito come stored procedure che ha cambiato/ha rotto con fuori avvertimento, ora ho fatto alcuni back-up e spero che questo non accada di nuovo. –

+0

Quindi, per quanto riguarda "come è successo?" domanda, hai provato i rapporti integrati? SQL 2K5 e 2K8 hanno una traccia predefinita in esecuzione in background che cattura tutte le modifiche dell'oggetto sul server. Le modifiche sono visibili tramite il rapporto Cronologia modifiche schema a livello di server o di database. Basta fare clic con il tasto destro del mouse sul database in questione, selezionare Report -> Report standard -> Cronologia modifiche schema.La quantità di cronologia disponibile dipenderà da quanta attività è stata eseguita, ma SQL Server conserva 5 file di traccia in linea. Si arrendono a 20 MB o al riavvio del server, a seconda dell'evento che si verifica per primo. –