Як я можу виявити порушені збережені процедури після зміни схеми?


11

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

Перевірка однієї єдиної збереженої процедури є простою (я просто повторюю сценарій alter і бачу, чи успішна операція), але робити це на 100+ процедурах трохи громіздко.

Я знаю , що можу використовувати сценарій , як цей перекомпіліровать всі об'єкти моїй базі даних, але фактична операція буде мати місце наступного разу , коли збережена процедура виконується, не відразу, так що не представляється доцільним в моєму випадку.

Я також думав, що я можу взагалі відмовитись від усіх збережених процедур і повторно синхронізувати свою базу даних зі своєю системою управління джерелами, але цей варіант, хоча і життєздатний, не дуже елегантний. Чи є кращий спосіб зробити це?

Я використовую SQLServer 2008 R2, і мої сценарії бази даних зберігаються в проекті баз даних VS 2008.


Для уточнення, я не виступаю за це, слід покладатися виключно на такий підхід до тестового коду. Так само, як у c # миттєво виявляєте синтаксичну помилку в інших залежних файлах під час кодування (а потім використовуєте інші стратегії тестування, такі як одиничні тести, які, як правило, на кілька порядків повільніше), я думаю, було б сенсом виявити залежності SQL помилок за лічені секунди, а не необхідність провести повний функціональний тест, який, як правило, може зайняти кілька годин.

Відповіді:


7

Як щодо запуску свого тесту, тестування функціональності, інтеграції та продуктивності? Якщо у вас немає тестів, то серйозно пора почати розглядати схему вашої бази даних як код і розглядати її як таку, включаючи контроль версій та тестування. Олексій Кузнєцов має цілу книгу, присвячену цій темі: Захисне програмування баз даних за допомогою SQL Server .


Тести не завжди охоплюють 100% коду, і коли вони це роблять, зазвичай потрібно кілька годин. У c # я можу виявити, чи мій код все ще збирається за лічені секунди (незалежно від правильності). Це не означає, що я повинен підштовхувати код (незалежно від того, що код є c # або PLSQL) у виробництво, не перевіряючи його належним чином, але це не здається нерозумним мати спосіб швидкого виявлення зламаних залежностей, чи не так?
Бранн

2
На жаль, стан сучасних технологій SQL Server зараз щодо виявлення залежності в збереженій процедурі "глибоко порушений", див. Розуміння залежностей SQL або Постійне оновлення sysdepends у SQL Server 2008 . Існують навіть сторонні інструменти, які намагаються вирішити цю проблему
Рем Русану

2
Це робить одиничні / функціональні тести майже єдиним надійним способом виявлення порушень змін.
Рем Русану

1
Для швидкої перевірки баз даних Visual Studio Projects виконує досить пристойну роботу при підтвердженні будь-яких змін.
Рем Русану

4

Це обробка, але ви можете створити сценарії CREATE PROCEDURE для бази даних (база даних правою кнопкою миші -> завдання -> створення сценаріїв), знайти та замінити CREATE PROCEDURE ALTER PROCEDURE, а потім проаналізувати.

Я сподіваюся, що ви тут отримаєте кращу відповідь - мені теж цікаво! :)


Я не відзначаю вашу відповідь прийнятою, тому що я все ще сподіваюся на більш чисте рішення (сподіваюся, сценарій), але ви обов'язково отримаєте мій +1! Дякую.
Бранн

3
Цей підхід не дасть вам знати, якщо ви посилаєтесь на неіснуючу таблицю .
Нік Чаммас

Цей підхід також не буде працювати, якщо згенерований сценарій більше, ніж приблизно 30 к. Рядків. Я ненавиджу, що я це знаю ..
Еонасдан

3

Можна використовувати інструменти даних сервера Sql (SSDT). Microsoft Visual Studio дозволяє створити проект сервера Sql. Потім імпортується база даних у проект, а потім будується проект. Якщо є якісь порушені збережені процедури або об'єкти, ви отримаєте помилку компіляції.


Додам, що ви можете легко генерувати новий сценарій створення бази даних з проекту SSDT і запускатись у тестовому середовищі, що буде досить ретельною перевіркою того, що жодних програм / тригерів / тощо не порушено через зміни схеми.
AaronLS

3

Ви можете поглянути на це питання ТА шукаю надійний спосіб перевірити збережені T-SQL процедури. Хтось отримав? який задає по суті те саме, з кількома відповідями.

Щоб побудувати на опублікованому сценарієм Alaa Awad ... це повинно показати схему та базу даних посилаються та референтних об'єктів. Якщо ви використовуєте багато темп-таблиць через псевдоніми (які іноді з’являються при використанні sys.sql_expression_dependencies), параметри UDTT або інші динамічні функції, можливо, вам знадобиться використовувати функції sys.dm_sql_referenced_entitiesабо sys.dm_sql_referencing_entitiesзамість / також.

SELECT
    DB_NAME() + '.' + OBJECT_SCHEMA_NAME(sed.referencing_id) + '.' + OBJECT_NAME(sed.referencing_id) AS [referencingObject],
    isnull(sed.referenced_server_name + '.', '') + isnull(sed.referenced_database_name + '.', DB_NAME() + '.') + isnull(sed.referenced_schema_name + '.', OBJECT_SCHEMA_NAME(sed.referencing_id) + '.') + sed.referenced_entity_name AS [missingReference]
FROM 
    sys.sql_expression_dependencies sed
WHERE 
    sed.is_ambiguous = 0
    AND OBJECT_ID(isnull(sed.referenced_database_name + '.', DB_NAME() + '.') + isnull(sed.referenced_schema_name + '.', OBJECT_SCHEMA_NAME(sed.referencing_id) + '.') + sed.referenced_entity_name) IS NULL
ORDER BY
    [referencingObject], [missingReference]

1
Слід додати їх до пункту де: / * Не існуючий тип користувача / І sed.referenced_entity_name НЕ (Вибір [ім'я] від sys.types) / Не псевдонім * / І sed.referenced_schema_name НЕ NULL
JasonBluefire

1

використовувати sys.sql_expression_dependitions, додані на сервері sql 2008

CREATE PROCEDURE [dbo].[spMaintenance_Find_Broken_Dependencies]

AS
SELECT
    OBJECT_NAME(referencing_id) AS [referencingObject],
    referenced_entity_name AS [missingReference]
FROM 
    sys.sql_expression_dependencies
WHERE 
    is_ambiguous = 0
    AND OBJECT_ID(referenced_entity_name) IS NULL
ORDER BY 
    OBJECT_NAME(referencing_id), referenced_entity_name

GO

Це може бути корисно, однак це не так просто, оскільки схему також потрібно враховувати. У мене також виникають проблеми, коли sys.sql_expession_dependitions відображає псевдонім, який використовується, а не фактичну залежну таблицю, що, очевидно, не відповідає тесту object_id (). Нарешті, він відображає визначені користувачем таблиці, передані як параметри для збережених процедур - що не дуже корисно.
Tabloo Quijico
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.