2010-08-19 32 views
5

Ich habe heute ein Ticket für eine beschädigte Anwendung erhalten, die durch eine fehlerhafte gespeicherte Prozedur verursacht wurde.Gespeicherte Broken Stored Procedure

Die gespeicherte Prozedur hatte nun schon ein paar Monate funktioniert, aber heute, als ich es untersucht habe, habe ich ein paar Fehler gefunden.

zuerst gab es eine Abfrage wie diese.

SELECT a.a , B.B , a.b FROM Tabelle1 einem table2 b JOIN ON. a.a = b.a

Die Zeit nach dem "ON" verursachte offensichtlich den Fehler. Es zu beheben war einfach, aber soweit ich weiß, können Sie eine gespeicherte Prozedur nicht speichern, die defekt ist. In der Tat, als ich die gespeicherte Prozedur öffnete, (ohne es zu ändern) und versuchte, die Änderung mit dem Code von dort auszuführen, scheiterte es mit den Fehlermeldungen.

Es gab andere Fehler wie diese durch die gespeicherte Prozedur, die ich behoben, um schließlich die Änderung auszuführen.

Ich verstehe nicht, wie das möglich ist, und möchte wissen, was eine gespeicherte Prozedur ändern und speichern könnte, die beschädigt ist. Von dem, was mir gesagt wurde, gab es überhaupt keine Änderungen am Server, und wie ich schon erwähnt habe, bevor diese gespeicherte Prozedur in den letzten Monaten gearbeitet hat

Es fühlt sich an, als würde ich einen Geist jagen, und jede Information wird sehr geschätzt.

+1

run Wählen Sie Name, create_date, modified_date, * aus sys.procedures und finden Sie heraus, wann die Prozedur in der Datenbank erstellt wurde. Überprüfen Sie, dass es nicht geändert wurde. –

Antwort

7

Ich vermute, das ist ein Problem der verzögerten Namensauflösung.

Mit SQL Server können Sie Prozeduren erstellen, die auf Objekte verweisen, die zum Zeitpunkt der Erstellung gespeicherter Prozeduren nicht vorhanden sind. In diesem Fall entscheidet SQL, die Kompilierung der Abfrage auf Laufzeit zu verschieben, da das Objekt zum Zeitpunkt des Aufrufs der Prozedur vorhanden sein wird. Daher wird die Syntax beim Erstellen der Prozedur nicht überprüft.
Wenn die Prozedur später ausgeführt wird, ist die Syntax falsch, Sie erhalten einen Fehler zu diesem Zeitpunkt, aber nicht während der Erstellung der Prozedur.

Zum Beispiel, wenn Tabelle1 und Tabelle2 nicht vorhanden sind, diese Aussage wird ohne Fehler ausführen:

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

Wenn Sie TestProc ausführen gehen, werden Sie die folgende Fehlermeldung erhalten: „Die mehrteilige Bezeichner ".aa" konnte nicht gebunden werden. "

+0

+1. Das habe ich nie bemerkt. Der Tag ist noch jung und ich habe schon etwas gelernt. –

+0

Ich habe tatsächlich ein Ereignis dieser Situation ein paar Tage später, wo "Ich" eine gespeicherte Prozedur mit einer temporären Tabelle erstellt. Obwohl ich immer noch nicht herausgefunden habe, wie sich diese gespeicherte Prozedur ohne Warnung verändert hat, habe ich jetzt ein paar Backups gemacht und ich hoffe, dass das nicht wieder passiert. –

+0

Also bezüglich der "Wie ist das passiert?" Frage, hast du die eingebauten Berichte ausprobiert? SQL 2K5 und 2K8 verfügen über eine Standardablaufverfolgung, die im Hintergrund ausgeführt wird und alle Objektänderungen auf dem Server erfasst. Änderungen sind im Bericht "Änderungen des Schema-Berichts" auf der Server- oder Datenbankebene sichtbar. Klicken Sie einfach mit der rechten Maustaste auf die betreffende Datenbank, wählen Sie Berichte -> Standardberichte -> Schema Änderungshistorie.Die Menge des verfügbaren Verlaufs hängt davon ab, wie viele Aktivitäten dort ausgeführt wurden, aber SQL Server führt 5 Trace-Dateien online. Sie werden bei 20 MB oder beim Neustart des Servers zurückgesetzt, je nachdem, was zuerst eintritt. –