2010-08-19 4 views
5

Я получил сегодня билет о сломанном приложении, вызванном сломанной хранимой процедурой.Сохраненная неисправная хранимая процедура

Хранимая процедура работала уже несколько месяцев, но сегодня, когда я ее осмотрел, я обнаружил несколько ошибок.

Сначала возник такой запрос.

ВЫБОР a.a , b.b , a.b ОТ таблица1 объединение table2 б ON. a.a = b.a

период после «ВКЛ», очевидно, вызвал ошибку. Фиксация была простой, но, насколько я знаю, вы не можете сохранить хранимую процедуру , которая сломана. Фактически, когда я открыл хранимую процедуру (без ее модификации) и попытался выполнить изменение с кодом оттуда, она не удалась с сообщениями об ошибках.

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

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

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

+1

запустите имя select, create_date, modified_date, * из sys.procedures и узнайте, когда процедура была создана в БД. Убедитесь, что он не был изменен. –

ответ

7

Я предполагаю, что это проблема отложенного разрешения имен.

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

Например, если table1 и table2 не существуют, это утверждение будет завершено без ошибок:

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

Когда вы идете, чтобы выполнить testproc, вы получите следующее сообщение об ошибке: «Мульти-части идентификатор «.aa» не может быть связан ».

+0

+1. Я этого никогда не замечал. День еще молод, и я уже кое-что узнал. –

+0

Я на самом деле столкнулся с возникновением этой ситуации несколько дней спустя, где «Я» создал хранимую процедуру с временной таблицей. Хотя я до сих пор не понял, как эта хранимая процедура изменилась/вышла из строя, я сделал несколько резервных копий, и я надеюсь, что этого больше не повторится. –

+0

Итак, что касается «как это произошло?» вопрос, вы пробовали встроенные отчеты? SQL 2K5 и 2K8 имеют трассировку по умолчанию, выполняемую в фоновом режиме, которая фиксирует все изменения объектов на сервере. Изменения отображаются в отчете истории изменений схемы на уровне сервера или базы данных. Просто щелкните правой кнопкой мыши на соответствующей базе данных, выберите «Отчеты» -> «Стандартные отчеты» -> «История изменений схемы».Объем доступной истории будет зависеть от того, сколько активности было, но SQL Server хранит 5 файлов трассировки в Интернете. Они переходят на 20 МБ или перезагрузка сервера, в зависимости от того, что наступит раньше. –

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