Предлагаю вашему вниманию статью о ссылках и поиске путеводных нитей.

Когда-то темой одной из моих первых публикаций стал поиск конкретных столбцов, позволяющих определить, внутри какой таблицы (или таблиц) может находиться столбец в базе данных. Для решения задачи использовалось системное представление каталога sys.all_columns (http://sqlmag.com/database-administration/using-allcolumns-system-view-sql-server). Поводом для написания статьи стало то, что мне, как администратору баз данных, приходилось обслуживать более 2000 отдельных баз данных, разработанных как внутри компании, так и сотнями независимых поставщиков программного обеспечения. Каждая компания-разработчик — и разработчик внутри компании — имеет собственный стиль программирования. Поиск ошибок внутри незнакомого кода — одна из задач специалиста по данным, которой приходится уделять время регулярно. Целью той давней статьи была идентификация мест, где существуют столбцы для устранения проблемы, влияющей на время непрерывной работы продукта, предназначенного для области здравоохранения.

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

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

Хранимая процедура для поиска хранимых процедур

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

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

  • имя базы данных;
  • имя схемы;
  • имя хранимой процедуры;
  • код хранимой процедуры.

Чтобы построить такую хранимую процедуру, потребуется несколько системных объектов: два системных представления каталога и одна недокументированная системная хранимая процедура.

Начнем с системных представлений каталога.

  • sys.procedures. Это системное представление собирает метаданные обо всех хранимых процедурах в базе данных. Каждая база данных имеет представление каталога sys.procedures. Возвращаются только результаты для содержимого базы данных, в котором оно размещено.
  • sys.syscomments. Это системное представление хранит исходный текст для каждой хранимой процедуры. В случае sys.procedures, sys.comments также действует в масштабе базы данных, поэтому предоставляет лишь сведения об объектах собственной базы данных.

Недокументированная системная хранимая процедура — sys.sp_MSforeachdb используется потому, что два системных представления каталога действуют в масштабе базы данных, следовательно, необходим способ возвращать результаты для этого запроса из всех баз данных. Вместе с Microsoft SQL Server поставляется недокументированная хранимая процедура в базе данных master, которая обеспечивает соответствующую функциональность. Вы можете передать параметр для команды T-SQL, которую нужно запустить для каждой базы данных, и результаты возвращаются как отдельные наборы записей для каждой базы данных, к которой применяется программный код.

Объединяем элементы

Теперь, когда мы знаем, из чего состоит решение, пришло время объединить все элементы. Программный код показан в

Это не вся статья. Полная версия доступна только подписчикам журнала. Пожалуйста, авторизуйтесь либо оформите подписку.

Поделитесь материалом с коллегами и друзьями

Купить номер с этой статьей в PDF