Обновление зависимых представлений после изменения DDL
Пересказ статьи Eduardo Pivaral. Refreshing dependent views after a DDL change
Когда вы отвечаете за базы данных с тоннами объектов, небольшие изменения объекта могут затруднить репликацию, если имеется множество объектов, которые зависят от него.
Здесь мы рассмотрим то, как обновлять представления при изменении столбцов.
Для подобных задач имеется 2 сценария:
Для этого примера мы будем использовать тестовую базу данных WideWorldImporters. Создадим два простых представления (одно зависящее от другого):
Выполняя второе представление, вы можете увидеть, что заголовки столбцов первого представления не столь описательны и могут быть улучшены.
Поэтому мы выполним команду alter view для первого представления:
Итак, мы сможем теперь увидеть обновленные имена столбцов во втором представлении, правильно?
Но если вы снова выполните выборку из представления, то получите прежние результаты:
Что произошло?
SQL Server предоставляет процедуру sp_refreshview для обновления метаданных представлений, поэтому вы можете использовать её для обновления схемы без необходимости пересоздавать объекты.
В нашем случае вы просто должны выполнить следующий код для второго представления:
Если мы опять обратимся ко второму представлению, то увидим, что теперь заголовки столбцов обновились:
Все, что вам нужно, это просто выполнить процедуру для каждого зависимого представления.
Есть несколько способов определить, какие объекты зависят от того, который вы модифицируете. Вот два из них.
- Вы явно описали имена столбцов в зависимых представлениях, или определили WITH SCHEMABINDING: В этом случае вам потребуется выполнить поиск и замену, что непросто сделать, поскольку нет встроенного инструментария для этого (насколько мне известно). Вы можете использовать бесплатные сторонние инструменты типа RedGate SQL Search или ApexSQL SQL Search, каждый из которых имеет свои плюсы и минусы. Так что вам нужно познакомиться с обоими, чтобы выбрать подходящий.
- Вы неявно определяли имена столбцов в зависимых представлениях: Пресловутое SELECT *, даже когда это не является лучшей практикой, способствует легкой репликации изменений, и мы увидим, как это сделать.
Установите наш пример
Для этого примера мы будем использовать тестовую базу данных WideWorldImporters. Создадим два простых представления (одно зависящее от другого):
USE WideWorldImporters;
GO
CREATE VIEW dbo.[vi_invoices_received_by]
AS
SELECT
ConfirmedReceivedBy,
COUNT(InvoiceID) as [Num],
CustomerID
FROM Sales.Invoices
GROUP BY ConfirmedReceivedBy, CustomerID;
GO
CREATE VIEW dbo.[vi_additional_fields_received_by]
AS
SELECT RB.*,
C.CustomerName
FROM dbo.vi_invoices_received_by RB
INNER JOIN sales.Customers C
ON C.CustomerID = RB.CustomerID;
GO
Выполняя второе представление, вы можете увидеть, что заголовки столбцов первого представления не столь описательны и могут быть улучшены.
Поэтому мы выполним команду alter view для первого представления:
ALTER VIEW dbo.[vi_invoices_received_by]
AS
SELECT
ConfirmedReceivedBy as [Received by],
COUNT(InvoiceID) as [# of Invoices],
CustomerID
FROM Sales.Invoices
GROUP BY ConfirmedReceivedBy, CustomerID;
GO
Итак, мы сможем теперь увидеть обновленные имена столбцов во втором представлении, правильно?
Но если вы снова выполните выборку из представления, то получите прежние результаты:
Что произошло?
Обновление ваших зависимых представлений
SQL Server предоставляет процедуру sp_refreshview для обновления метаданных представлений, поэтому вы можете использовать её для обновления схемы без необходимости пересоздавать объекты.
В нашем случае вы просто должны выполнить следующий код для второго представления:
EXEC sp_refreshview 'dbo.[vi_additional_fields_received_by]';
GO
Если мы опять обратимся ко второму представлению, то увидим, что теперь заголовки столбцов обновились:
Все, что вам нужно, это просто выполнить процедуру для каждого зависимого представления.
А что, если я не знаю зависимых объектов?
Есть несколько способов определить, какие объекты зависят от того, который вы модифицируете. Вот два из них.
- С помощью T-SQL: Выполните процедуру sp_depends; она вернет два подмножества: первое - объекты, от которого зависит ваш текущий объект. Второе - объекты, которые зависят от текущего объекта. Используется так:
- С помощью SSMS: Просто выполните щелчок правой кнопкой и выберите View Dependencies
Обратные ссылки
Автор не разрешил комментировать эту запись
Комментарии
Показывать комментарии Как список | Древовидной структурой