Отключение проверки схемы при создании функции / хранимой процедуры


17

Я пытаюсь автоматизировать процесс, который выполняет изменения в базе данных SQL Server 2008 R2. Введенный мной процесс удаляет и воссоздает мои хранимые процедуры и функции, а также запускает сценарии для изменения таблиц / столбцов / данных. К сожалению, один из сценариев требует, чтобы сначала была задействована одна из функций. Но я не могу сначала запустить все сохраненные изменения процедур / функций, потому что они основаны на добавлении столбцов из сценариев таблиц / столбцов / изменений данных.

Мне было интересно, можно ли было запускать хранимые процедуры и функции без проверки SQL Server столбцов, используемых в определении функции / SP? Я попытался посмотреть, но не смог найти условие или команду, чтобы включить это.


Похоже, вам просто нужно изменить порядок создания объектов в ваших скриптах.
Томас Стрингер

@shark Дело в том, что сценарий изменения требует зависимости от присутствующей функции, чего не было в то время ... для этого потребовалось бы ручное вмешательство; Я хотел что-то более автоматическое.
Брайан Майнс

Ответы:


20

Вы можете создавать хранимые процедуры, которые ссылаются на объекты, которые еще не существуют (например, таблицы и функции). Вы не можете создавать хранимые процедуры, которые ссылаются на столбцы, которые еще не существуют в объектах, которые уже существуют. Это обоюдоострый меч отложенного разрешения имен - SQL Server дает вам преимущество сомнения в некоторых случаях, но не во всех. Посмотрите на идеи Эрланда, SET STRICT_CHECKS ON;чтобы получить некоторые представления о местах, где это работает, и местах, которые он разрушает:

http://www.sommarskog.se/strict_checks.html

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

Там нет настройки, как SET DEFERRED_NAME_RESOLUTION OFF;будто это было запрошено:

http://connect.microsoft.com/sql/127152

И нет такой настройки, как IGNORE ALL_RESOLUTION;.


Вы можете обойти это несколькими способами, в том числе:

(a) использовать динамический SQL в затронутых хранимых процедурах.

(b) создайте заглушку, в CREATE PROCEDUREкоторой ничего не будет, затем запустите остальную часть вашего сценария, затем запустите объект, ALTER PROCEDUREимеющий реальное тело (по сути, разверните процедуру в два этапа).

(c) сделать ваш инструмент развертывания более умным в отношении порядка операций. Если для изменения таблицы требуется наличие функции, запишите эти изменения в последнюю очередь. Инструменты сравнения схем, такие как RedGate SQL Compare, довольно хороши для генерации скриптов для вас в правильном порядке зависимостей. Вы не упоминаете, какой инструмент используете, но если он этого не делает ...

(d) У Мартина Смита есть интересный обходной путь , но я не играл с ним.


Ничего себе, этот хак Мартина Смита блестяще умен. Я чувствовал бы себя грязным, используя это сейчас, но в моих ранних 20-ых имел бы.
Джон Забросский

1

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

Код ниже запускает хранимую процедуру, которая ссылается на столбцы, которые еще не существуют (Expense_Super_Compare)

IF OBJECT_ID('Expense_Super_Compare_Results', 'U') IS NOT NULL
BEGIN
     EXEC('DROP TABLE Expense_Super_Compare_Results');
END

exec('exec dbo.Expense_Super_Compare');
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.