Вопрос по sql-server, sql-server-2005, sql-server-2008 – Перекомпилировать сохраненные процы?

2

Есть ли способ перекомпилировать или, по крайней мере, «проверить компиляцию»? массовые хранимые процедуры? Иногда мы вносим изменения в схему - добавляем или удаляем столбец и т. Д. И делаем все возможное, чтобы идентифицировать затронутые процессы только для того, чтобы быть укушенным одним из тех, кого мы пропустили, и что будет неприятно при следующем запуске. SQLServer 2k5 или 2k8.

Нет, это более печально, чем это. TDD помог бы нам - это спрэки, которые зависят, например, от столбца, который мы отбросили, и мы не "обнаруживаем" что до тех пор, пока процесс не будет выполнен. Взрыва. n8wrl
Всякий раз, когда вы вносите изменение схемы, которое делает недействительным план выполнения, который имеет SQL-сервер, SQL-сервер помечает этот sp для перекомпиляции в любом случае. Что тебе удалось сделать, чтобы отключить это? Justin

Ваш Ответ

5   ответов
1

sysobjectsи запуститьsp_recompile:

Вот ссылка, показывающая пример скрипта:
http://database.ittoolbox.com/groups/technical-functional/sql-server-l/recompile-all-stored-procedures-2764478

MSDN говорит, что sp_recompile "вызывает повторную компиляцию хранимых процедур и триггеров при следующем запуске."called
Проще использовать «sp_recompile tablename», так как он помечает для перекомпиляции все процедуры, которые ссылаются на таблицу. Однако это не будет работать для OP, так как sp_recompile помечает только процедуры для перекомпиляции. Они на самом деле компилируются при следующем запуске, в то же время, когда изменения OP "quot; puking" во время выполнения.
3

Я знаю, что вы имеете в виду, и во многих сценариях признает вашу потребность. Вы могли бы взглянуть наsp_refreshsqlmodule.

Удачи Рон

Error: User Rate Limit Exceeded n8wrl
1
5

я хочу проверить все процедуры, которые они все еще правильно выполняют с новой схемой". То есть. если вы отбрасываете столбец, на который ссылается SELECT в процедуре, то вы хотите, чтобы он был помечен, поскольку он требует изменений. Поэтому, в частности, я не понимаю ваш вопрос как «я хочу, чтобы процедура перекомпилировалась при следующем выполнении», так как это задание выполняется для вас механизмом, который обнаружит изменение версии метаданных, связанное с любым изменением схемы, и откажется от существующие кэшированные планы выполнения.

Мое первое наблюдение состоит в том, что то, что вы описываете в своем вопросе, обычно является работойTEST и у вас должен быть этап QA в процессе развертывания, который проверяет новую «сборку». Лучшее решение, которое вы могли бы иметь, - это реализовать минимальный набор модульных тестов, который, по крайней мере, повторяет все ваши хранимые процедуры и проверяетexecution каждого для правильности, в тестовом развертывании. Это в значительной степени устранит все неожиданности, по крайней мере устранит их там, где это больно (на производстве или на месте клиента).

Следующим лучшим вариантом будет использование инструментов разработки для отслеживания этих зависимостей.Visual Studio Database 2008 Database Edition предоставляет такую функциональность из коробки, и он позаботится о проверке любых изменений, внесенных вами в схему.

И, наконец, ваш последний вариант - сделать нечто похожее на то, что предлагал KM: автоматизировать итерацию всех ваших процедур в зависимости от измененного объекта (и всех процедур в зависимости от зависимых и т. Д. И т. Д. И т. Д. Рекурсивно). Недостаточно отметить процедуры перекомпиляции, вам действительно нужно запустить ALTER PROCEDURE, чтобы запустить синтаксический анализ его текста и проверку схемы (в T-SQL все немного отличается от вашего обычного языка). цикл компиляции / выполнения, «компиляция» per se происходит только тогда, когда процедура фактически выполняется). Вы можете начать с итерацииsys.sql_dependencies чтобы найти все зависимости вашего измененного объекта, а также найти «определение модуля»; из зависимостей отsys.sql_modules:

with cte_dep as (
   select object_id
      from sys.sql_dependencies
    where referenced_major_id = object_id('<your altered object name>') 
    union all
    select d.object_id
    from sys.sql_dependencies d
        join cte_dep r on d.referenced_major_id = r.object_id
    )
, cte_distinct as (
    select distinct object_id
        from cte_dep)
select object_name(c.object_id)
    , c.object_id 
    , m.definition
    from cte_distinct c
    join sys.sql_modules m on c.object_id = m.object_id

Затем вы можете пройти через зависимые «модули». и воссоздайте их (то есть удалите их и запустите код в «определении»). Обратите внимание, что «модуль» является более общим, чем хранимая процедура, и охватывает также представления, триггеры, функции, правила, значения по умолчанию и фильтры репликации. Зашифрованные «модули» не будет определения доступного определения, и чтобы быть абсолютно правильным, вы также должны учитывать различные настройки, зафиксированные вsys.sql_modules (ANSI NULL, привязка схемы, выполнение как пункты и т. д.).

Если вы используете динамический SQL, это невозможно проверить. Это не будет захваченоsys.sql_dependenciesи он не будет проверен путем «повторного создания»; модуль.

Overall I think your best option, by a large margin, is to implement the unit tests validation.

4

оцедур, попробуйтеsp_depends:

sp_depends [ @objname = ] '<object>' 

<object> ::=
{
    [ database_name. [ schema_name ] . | schema_name.
        object_name
}

и идентифицировать их, прежде чем они сломаются. Используйте это так:

EXECUTE sp_depends  YourChangedTableName

Также вы можете использоватьsp_recompile:

EXEC sp_recompile YourChangedTable

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

Вы можете использовать Management Studio или систему управления исходным кодом, чтобы сгенерировать объединенный сценарий создания всех процедур в один файл, а затем запустить его.

Error: User Rate Limit Exceededsp_depends.

Похожие вопросы