Skip to content

Обновление зависимых представлений после изменения DDL

Пересказ статьи Eduardo Pivaral. Refreshing dependent views after a DDL change


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

Здесь мы рассмотрим то, как обновлять представления при изменении столбцов.
Для подобных задач имеется 2 сценария:

  • Вы явно описали имена столбцов в зависимых представлениях, или определили 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





Категории: T-SQL

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Автор не разрешил комментировать эту запись

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Добавленные комментарии должны будут пройти модерацию прежде, чем будут показаны.