Поиск объектов SQL, которые ссылаются на столбцы таблицы, которые не существуют

#sql-server #azure-devops #sql-server-2014 #sql-server-data-tools #dacpac

#sql-сервер #azure-devops #sql-server-2014 #sql-server-data-tools #dacpac

Вопрос:

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

Сейчас мы внедряем Azure DevOps, поэтому, когда я импортирую файл dacpac в проект базы данных, я вижу больше неразрешенных ошибок. Когда я проверяю, есть больше неиспользуемых хранимых процедур и представлений, которые ссылаются на столбцы таблицы, которые сейчас не существуют.

Как я могу найти объекты, которые ссылаются на недопустимые столбцы и таблицы?

Ответ №1:

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

Ответ №2:

Я не уверен, что вы сможете найти все в автоматическом режиме. SSDT жалуется на неразрешенную ссылку не только при наличии поврежденного объекта, но и при использовании 3-4 имен частей (перекрестные ссылки на базы данных), поэтому, вероятно, решение, предоставленное @Krzysztof, не будет работать или будет работать только частично.

Что вам нужно сделать:

  • Найдите все объекты 3-4 части в коде
  • Добавьте все базы данных, необходимые для этого кода, в качестве ссылок
  • Создайте синонимы для каждого из этих объектов
  • Используйте [$(server_var)].[$(database_var)].schema.object синтаксис в своих синонимах

Эти шаги не так сложны, как может показаться. Вы можете вносить ~ 90% изменений массово, используя замену строк во всех файлах. Например, если вы используете объекты из другой базы данных -> DatabaseA. Таким образом, в коде у вас будут только ограниченные комбинации возможных имен объектов:

  • DatabaseA..Имятаблицы
  • DatabaseA.dbo.tableName
  • DatabaseA.other_schema.Имя_таблицы
  • [База данных] ..Имятаблицы
  • … и так далее, Если вы замените все эти значения на dbo.tableName where dbo.tableName будет новым синонимом, тогда это должно сработать.

Обычно этот процесс должен занимать максимум 1-2 дня.