Удаление хранимой процедуры на сервере SQL - PullRequest
1 голос
/ 20 августа 2009

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

Ответы [ 6 ]

5 голосов
/ 20 августа 2009

Для SQL Server 2005 и выше, работает с более длинным кодом.

SELECT
    OBJECT_NAME(object_id)
FROM
    sys.sql_modules
WHERE
    definition LIKE '%' + 'mySP' + '%'
3 голосов
/ 20 августа 2009

или переименуйте sp вместо удаления. если есть неопознанная зависимость, вы можете быстро вернуть sp.

еще одна вещь, которую вы можете сделать, это составить сценарий ваших представлений, функций и sps и искать сценарии. опять же, не будет ловить динамический sql, но может поймать несколько дополнительных ссылок.

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

Если у вас есть полный набор модульных тестов, удалите SP и запустите тесты, чтобы увидеть, не сломалось ли что-нибудь. Если у вас нет комплекта, у вас нет времени, чтобы начать писать его.

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

В идеале, в вашем коде C # у вас есть только один метод, который (концептуально) «разрешен» для вызова хранимой процедуры, и этот метод должен находиться на уровне доступа к данным (единственный уровень, которому разрешено иметь доступ к базе данных строка подключения).

Способность применять что-либо подобное на уровне C # практически отсутствует. Как правило, его необходимо применять посредством соглашений о кодировании и проверки кода.

На данный момент поиск строки по коду C #, вероятно, ваш единственный вариант, и я согласен, что он не самый удачный. Если вы можете ограничить поиск строк одним проектом на C #, это замечательно, но не обязательно в дикой природе.

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

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

Вам нужно выполнить поиск до того, как вы его отбросите, используя sys.sql_dependencies представление каталога:

select object_name(object_id), *
    from sys.sql_dependencies
    where referenced_major_id = object_id('<nameofproceduretobedropped>');

Это ловит все ссылки на процедуру в других процедурах, но не может ловить динамические зависимости sql.

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

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

У меня есть этот код для поиска текста по всем триггерам (немного резкий, извините), может быть, вы можете адаптировать его для поиска по другим объектам базы данных также:

SELECT  Tables.Name TableName,
        Triggers.name TriggerName,
        Triggers.crdate TriggerCreatedDate,
        Comments.Text TriggerText
FROM sysobjects Triggers
    Join sysobjects Tables On Triggers.parent_obj = Tables.id
    Join syscomments Comments On Triggers.id = Comments.id
WHERE
    Triggers.xtype = 'TR'
AND Tables.xtype = 'U'
AND (@ttable_name = '' OR Tables.name = @table_name)
AND Comments.Text LIKE '%' + @search + '%'
ORDER BY Tables.Name, Triggers.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...