отменить изменения в хранимой процедуре - PullRequest
3 голосов
/ 19 июля 2011

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

К сожалению, у меня нет резервной копии этой базы данных, поэтому этот параметр исключен.

Ответы [ 8 ]

8 голосов
/ 19 июля 2011

Ответ: ДА , вы можете вернуть его, но это нелегко. Все базы данных регистрируются каждое изменение, внесенное в него. Вам необходимо:

  1. Завершить работу сервера (или хотя бы перевести его в режим только для чтения)
  2. Создание полной резервной копии сервера
  3. Получить копию всех файлов журнала базы данных, начиная с того момента, когда произошла авария
  4. Восстановить резервную копию на другом сервере
  5. Используя инструменты администратора БД, откатывайтесь по файлам журнала, пока не "отмените" аварию
  6. Изучите восстановленный код в хранимой процедуре и верните его в текущую версию

И самое главное: ПОЛУЧИТЕ КОДЕВОЙ ХРАНИЛИЩЕ ПОРЯДОК УПРАВЛЕНИЯ ИСТОЧНИКОМ

Большинство людей не «понимают» эту концепцию: вы можете только вносить изменения в базу данных; Вы не можете откатить версию кода, как вы можете с помощью кода приложения. Чтобы «откатиться», вы должны внести больше изменений и удалить / определить свой сохраненный процесс (или любой другой).

Примечание для придирки: под «откатом» я не подразумеваю «откат транзакции». Я имею в виду, что вы внесли свои изменения и решили, что резервное копирование на сервере не принесло изменений.

3 голосов
/ 19 июля 2011

В дополнение к разумному совету использовать резервное копирование или восстановление из системы контроля версий (и если вы не делаете ни одной из этих вещей, вам нужно запустить), вы также можете рассмотреть возможность получения SSMS Tools Pack от @ MladenPrajdic .Его надстройка Management Studio позволяет вести историю всех запросов, над которыми вы работали или выполняли, поэтому очень легко вернуться в прошлое и посмотреть предыдущие версии.Хотя это не поможет вам, если кто-то еще работал над последней известной версией, если вся ваша команда использует ее, любой может вернуться и увидеть любую версию, которая была выполнена.Вы можете указать, где он будет сохранен (в вашей собственной файловой системе, в сетевой папке или в базе данных), и точно настроить частоту автоматического сохранения. Действительно бесценная функциональность, особенно если вам лень делать резервные копии и / илиуправление исходным кодом (хотя, опять же, я подчеркиваю, вам следует заняться этими вещами, прежде чем снова коснуться рабочего сервера).

2 голосов
/ 19 июля 2011

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

РЕДАКТИРОВАТЬ

ХотяБогемный, похоже, даст хороший ответ, если у вас есть изменения в TL, это - это то, о чем я говорю.Просмотрите текст SQL для плана.

SELECT  cached.*,
               sqltext.*
         FROM  sys.dm_exec_cached_plans cached
  CROSS APPLY  sys.dm_exec_sql_text (cached.plan_handle) AS sqltext

Но, как указывает Скиллман, для DDL нет плана выполнения.

2 голосов
/ 19 июля 2011

Вы не сможете получить его обратно со стороны базы данных вещей.На данный момент ваши параметры в значительной степени ограничены: 1) восстановить из резервной копии, 2) перейти к управлению исходным кодом или 3) надеяться, что у кого-то еще есть копия, которая все еще находится в редакторе или сохранена в файле.Если ни один из этих вариантов для вас не подходит, то вот обязательное «вы должны регулярно делать резервные копии и использовать контроль исходного кода» ....

2 голосов
/ 19 июля 2011

«Есть ли способ отменить изменения и вернуть старый скрипт?»

Краткий ответ: Нет.

: - (

1 голос
/ 21 сентября 2012

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

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

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

Не забудьте удалить вновь созданную базу данных после восстановления отсутствующего файла.

0 голосов
/ 24 ноября 2015

Если вы запрограммировали хранимую процедуру из проводника объектов Management Studio, это сработает. Прежде чем развернуть и свернуть проводник объектов, просто прокрутите и укажите на хранимую процедуру, которую вы открыли. Сценарий хранимой процедуры как создать или изменить, чтобы вы могли получить предыдущую версию процедуры, так как проводник еще не обновлен. Это всегда моя жизнь.

0 голосов
/ 22 августа 2013

У меня была такая же проблема, и я не уверен, что могу восстановить файлы журнала на другом сервере.Я был в замешательстве, пока не понял, что решение очень простое ...

Нажимайте Ctrl-Z снова и снова, пока я не отменю свои изменения и снова не выполню процедуру ALTER PROCEDURE.

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

...