Відключення перевірки схеми щодо функцій / створення збережених процедур


17

Я намагаюся автоматизувати процес, який виконує зміни в базі даних SQL Server 2008 R2. Процес, який я ввожу, замінює і відтворює мої збережені процедури та функції, а також запускає скрипти для зміни таблиць / стовпців / даних. На жаль, один із сценаріїв вимагає встановити одну з функцій першою. Але я не можу спершу запустити всі збережені зміни proc / функцій, оскільки спочатку він покладається на додавання стовпців із скриптів таблиць / стовпців / змін даних.

Мені було цікаво, чи можна запускати збережені процедури та функції без перевірки 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 Порівняння, досить добре допомагають створювати сценарії для вас у відповідному порядку залежності. Ви не згадуєте, який інструмент використовуєте, але якщо це не робиться ...

(г) Мартін Сміт має тут цікаве рішення , але я з ним не грав.


Ого, що хакер Мартіна Сміта геніально розумний. Я б почувався брудним, використовуючи це зараз, але на початку 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.