Как я могу отслеживать зависимости баз данных?

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

Я работал там, где были сделаны довольно жестокие варианты, такие как:

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

Я понимаю, что SQL Server поставляется с инструментами для отслеживания зависимостей внутри этого экземпляра, но они, похоже, работают, если у вас есть базы данных в разных экземплярах. Существуют ли опции, облегчающие запрос зависимостей, возможно, ответы на такие вопросы, как «Где этот столбец используется?» с ответами типа «На другом сервере в этой хранимой процедуре» или «Завершение в этом пакете SSIS»?

37 голосов | спросил Rowland Shaw 28 Jpm1000000pmFri, 28 Jan 2011 16:43:15 +030011 2011, 16:43:15

10 ответов


14

Нет простого способа сделать это. Триггеры не работают, как если бы вы выбрали из таблицы, ни один триггер не будет запущен. Лучший способ, который я нашел для этого, - заставить разработчиков отслеживать, что они используют. Когда что-то будет сброшено, отметьте все команды разработчиков, и после того, как все отметят, переименуйте объект. Тогда ничто не прерывается в течение месяца или до, объект можно безопасно отбросить.

ответил mrdenny 28 Jpm1000000pmFri, 28 Jan 2011 21:24:17 +030011 2011, 21:24:17
7
  1. Код поиска для использования с sys.sql_modules.definition: на него ссылаются? Тогда ...
  2. Проверить разрешения: какой код клиента может назвать это? Тогда ...
  3. Профили

Таким образом:

  • Для таблицы без ссылки и без разрешений она не используется.
  • Без ссылок и некоторых разрешений запустите профайлер, чтобы увидеть использование
  • Без разрешений и ссылок добавьте протоколирование использования

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

ответил gbn 30 Jpm1000000pmSun, 30 Jan 2011 21:48:07 +030011 2011, 21:48:07
6

Одним быстрым способом, который я использовал в прошлом (и это действительно зависит от размера таблиц, количества показателей производительности и т. д.), заключается в добавлении триггера, который регистрирует метку времени, когда действие выполняется в таблице. Как я уже сказал, это может иметь проблемы с производительностью, поэтому с ними следует обращаться с осторожностью - также наблюдайте, что ваша таблица журналов не использует поля идентификации, так как это может испортить старый код, который использует @@ IDENTITY. Конечно, он может просто показать, что функция в приложении ни разу не использовалась.

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

EDIT: Чтобы устранить то, что таблица не может иметь триггеры SELECT, вот еще один вариант, который должен работать, если ваши таблицы имеют индексы (только в 2008 году).

SELECT          
    last_user_seek,
    last_user_scan,
    last_user_lookup,
    last_user_update
FROM
    sys.dm_db_index_usage_stats AS usage_stats
INNER JOIN
sys.tables AS tables ON tables.object_id = usage_stats.object_id
WHERE
    database_id = DB_ID() AND
    tables.name = 'mytable' 

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

ответил Miles D 28 Jpm1000000pmFri, 28 Jan 2011 18:46:42 +030011 2011, 18:46:42
4

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

Как я установил список:

  1. посмотреть, какие таблицы не используются в текущих хранимых процедурах, триггерах и функциях

  2. пустые таблицы (нулевые записи);

  3. таблицы без ссылок (таблицы, которые не имеют каких-либо отношений);

  4. посмотреть, какие таблицы не использовались с момента запуска сервера БД (DMV)

После создания списка в текстовом файле я создал пакетный скрипт, который будет анализировать наши .cs-файлы (у нас есть только .net-проекты) из локальной управляемой папки с контролем версий и посмотреть, используются ли эти таблицы в. cs-файлы (не должно быть, но эй .. у меня были сюрпризы). Если нет, тогда ясно, если да, то мы создадим список и дадим разработчикам проверить, что этот модуль все еще используется.

Итак, короче говоря, предыдущие ребята правы, нет серебряной пули.

ответил Marian 30 Jpm1000000pmSun, 30 Jan 2011 13:26:47 +030011 2011, 13:26:47
3

Политика, которую я внедряю в своей компании, - это поставить все, что касается SQL Server под контролем источника, в центральном месте.

  • Проекты asp.net
  • Проекты SSRS
  • Проекты SSIS
  • Я даже скриптую все объекты базы данных в хранилище сортирует.

У меня его еще нет, но в конце концов я хочу реализовать какой-то механизм индекса /центрального поиска, который я мог бы использовать для поиска конкретных таблиц, sprocs и т. д. Мы на самом деле являемся новым магазином SQL Server - конвертирования из FoxPro. Таким образом, старые объекты SQL еще не являются проблемой, но я планирую будущее.

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

ответил Brian Vander Plaats 31 Jpm1000000pmMon, 31 Jan 2011 18:30:50 +030011 2011, 18:30:50
3

Существует множество инструментов и методов для использования в отслеживании зависимостей, включая:

Инструменты, которые я знаю:

  • Средство просмотра зависимостей SQL Server (но может иметь проблемы, если была создана команда sp using table до создания таблицы)
  • Redgate SQL Dependency Tracker (через ответ @Eric Humphrey ) литий>
  • Resharper (инструмент .net, который можно использовать для просмотра путей вызова, I think он может использоваться для отслеживания того, где используются ключевые вызовы SQL)

Методы

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

    SELECT 
        last_execution_time,   
        (SELECT TOP 1 
            SUBSTRING(s2.text,statement_start_offset / 2+1 , 
                ((CASE WHEN statement_end_offset = -1 THEN 
                    (LEN(CONVERT(nvarchar(max),s2.text)) * 2) 
                ELSE statement_end_offset END) - statement_start_offset) / 2+1)
        )  AS sql_statement,
        execution_count
    FROM sys.dm_exec_query_stats AS s1 
    CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2  
    WHERE 
        s2.text like '%[OBJECT NAME]%' 
        and last_execution_time > [DATE YOU CARE ABOUT]
    ORDER BY last_execution_time desc
    

Примечание . Таблица статистики использования очищается при перезапуске сервера, отключении и т. д. Таким образом, вам нужно будет создать задание для сбора данных. Я знаю, что есть. (из @Miles D)

Методы

  • Поиск последнего использования (см. выше статистику использования)
  • Найти, где он используется (см. инструменты)
  • Просмотрите использование кода с помощью разработчиков (через @MrDenny)
  • Переименовать объект (т. е. post /prefix с _toBeDropped) и следить за ошибками
  • Изменение разрешений и просмотр ошибок
  • Отбросьте объект и помолитесь
ответил Brian Vander Plaats 31 Jpm1000000pmMon, 31 Jan 2011 18:30:50 +030011 2011, 18:30:50
2

Несколько лет назад я попытался создать инструмент для проверки подобного материала. Ответ TL, DR заключается в том, что я обнаружил, что в это время невозможно использовать доступные ресурсы.

  

Где используется этот столбец?

Этот вопрос усложняется, когда вы понимаете, что в ряде запросов, представлений и хранимых процедур используется select * из таблицы, в которой находится этот столбец. Затем вам нужно посмотреть программы, которые используют эти результаты - так что вам нужен сканер /индекс /парсер, способный читать исходный код, который может быть C #, Delphi, Java, VB, ASP (классический) и т. д., чтобы попытаться выследить каждую ссылку на этот столбец. Затем вам нужно проанализировать эти программы, чтобы попытаться определить, действительно ли этот код уже вызван.

ответил Tangurena 31 Jam1000000amMon, 31 Jan 2011 01:26:09 +030011 2011, 01:26:09
2

Не будет обрабатывать ссылки SQL, но вы можете захотеть проверить Reddate на SQL Dependency Tracker . Это хороший инструмент визуализации.

ответил Eric Humphrey - lotsahelp 4 FebruaryEurope/MoscowbFri, 04 Feb 2011 02:35:22 +0300000000amFri, 04 Feb 2011 02:35:22 +030011 2011, 02:35:22
2

На самом деле это не ответ на ваш вопрос, но я думаю, что это упоминается: это одна из причин, почему все системы вне вашей базы данных должны связываться через представления и sprocs . У вас есть скрипты сборки для них в файлах с возможностью поиска .sql, поэтому вы можете легко увидеть, используется ли какая-либо таблица или столбец извне.

Конечно, SSIS, как правило, напрямую подключается к таблицам, поэтому это, вероятно, не очень помогает вашей потребности прямо сейчас. Но когда разработчики подключаются к вашей базе данных и жалуются на то, что вам придется ждать (или тех, кто служит в качестве администратора баз данных), чтобы сделать необходимые им виды и sprocs, вы можете сказать им: «Любая таблица или столбец могут быть удалены или переименованы. m обязано держать вас в курсе изменений взглядов и sprocs. " И они должны только выполнить регрессионное тестирование для этих конкретных изменений.

ответил Jon of All Trades 25 Jpm1000000pmWed, 25 Jan 2012 22:38:40 +040012 2012, 22:38:40
0

TSQL можно использовать sys.dm_sql_referencing_entities или sys.sql_expression_dependencies

В качестве альтернативы инструменты, такие как SQL Negotiator Pro, Redgate и т. д., могут визуально визуализировать вас с помощью графического интерфейса пользователя

ответил Jenny T 30 AM00000030000005331 2013, 03:32:53

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132