Я пытаюсь автоматизировать процесс, который выполняет изменения в базе данных SQL Server 2008 R2. Введенный мной процесс удаляет и воссоздает мои хранимые процедуры и функции, а также запускает сценарии для изменения таблиц / столбцов / данных. К сожалению, один из сценариев требует, чтобы сначала была задействована одна из функций. Но я не могу сначала запустить все сохраненные изменения процедур / функций, потому что они основаны на добавлении столбцов из сценариев таблиц / столбцов / изменений данных.
Мне было интересно, можно ли было запускать хранимые процедуры и функции без проверки SQL Server столбцов, используемых в определении функции / SP? Я попытался посмотреть, но не смог найти условие или команду, чтобы включить это.
sql-server
sql-server-2008-r2
stored-procedures
functions
ddl
Брайан Майнс
источник
источник
Ответы:
Вы можете создавать хранимые процедуры, которые ссылаются на объекты, которые еще не существуют (например, таблицы и функции). Вы не можете создавать хранимые процедуры, которые ссылаются на столбцы, которые еще не существуют в объектах, которые уже существуют. Это обоюдоострый меч отложенного разрешения имен - 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) У Мартина Смита есть интересный обходной путь , но я не играл с ним.
источник
Вы можете создать хранимую процедуру, которая сначала удаляет или переименовывает рассматриваемый объект, а затем запускает исходную хранимую процедуру как динамический SQL. Таким образом, вам не нужно переписывать фактическую хранимую процедуру для использования динамического SQL.
Код ниже запускает хранимую процедуру, которая ссылается на столбцы, которые еще не существуют (Expense_Super_Compare)
источник