SQL Server: проверка ссылок при изменении сигнатур функций / процедур - PullRequest
0 голосов
/ 04 августа 2009

Один из моих коллег работает над набором хранимых процедур и изменяет входные параметры для одной из них.

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

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

Это возможно в 2K8?

Ответы [ 3 ]

2 голосов
/ 04 августа 2009

Вы не можете добавить триггер в системную таблицу, но вы можете создать DDL-триггер, который будет запускаться в операторе ALTER PROC - пример:

ALTER TRIGGER DDL_PROC
ON DATABASE
FOR ALTER_PROCEDURE
AS
DECLARE @data XML, @ObjectName sysname, @ParamCount int
SET @data = EVENTDATA()
SET @ObjectName = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname')

PRINT 'You have changed procedure: ' + @ObjectName
SELECT @ParamCount = COUNT(*) FROM sys.parameters
WHERE object_id = OBJECT_ID(@ObjectName)
RAISERROR('This procedure now has %i parameter(s)',0,0,@ParamCount)
GO

Я не уверен, как получить предыдущий список параметров или, если это вообще возможно, кто-нибудь знает?

Я бы согласился с предложением Чарльза сделать новые параметры необязательными, если это возможно - существующий код не сломается, и вам нужно будет найти ссылки, только если вы должны добавить параметр в вызов.

Создание сценариев для базы данных кажется долгим процессом. Простой запрос, такой как следующий, должен найти все ссылки на ваш процесс (в вашей базе данных):

SELECT so.name, so.type_desc
FROM sys.all_objects so
    JOIN sys.all_sql_modules sm ON so.[object_id] = sm.[object_id]
WHERE sm.[definition] LIKE '%<proc name>%'

Это то же самое, но также будет работать в предыдущих версиях SQL-сервера:

SELECT so.name, so.type
FROM syscomments sc
    JOIN sysobjects so ON sc.id = so.id
where text like '%<proc name>%'

Надеюсь, это поможет,

MDD

1 голос
/ 04 августа 2009

Самое простое - написать сценарий в базе данных, а затем выполнить поиск.


  1. Щелкните правой кнопкой мыши базу данных и выберите Задачи-> Создать сценарии
  2. Нажмите «Далее», если появится страница приветствия
  3. Выберите базу данных
  4. Снова нажмите «Далее»
  5. Выберите Триггеры базы данных, Хранимые процедуры, Таблицы, Пользовательские функции и Представления, затем нажмите «Далее»
  6. На следующих нескольких страницах выберите все объекты выбранного типа с помощью «Выбрать все», затем нажмите «Далее»
  7. Выберите «Скрипт в файл» и сохраните файл, в котором вы сможете его найти.
  8. Нажмите «Готово»

После того, как скрипт создан, вы можете использовать ваши любимые инструменты для поиска скрипта. Вы даже можете использовать регулярные выражения в SSMS с помощью команды «Найти в файлах».

0 голосов
/ 04 августа 2009

Другой вариант (если это будет соответствовать вашим требованиям) - изменить существующую процедуру так, чтобы старый существующий параметр был необязательным (просто добавьте «= Null» в конце), добавьте новый параметр как необязательный, и перепишите sProc sp, что он будет использовать один или другой в зависимости от того, какой из них передан ... Тогда старый код, который вызывает его со старым параметром, продолжит функционировать так же, как раньше ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...