Несколько SQL-представлений, одна точка определения, как?

У меня следующая ситуация:

  • Несколько просмотров базы данных (около 12, увеличится в будущем)
  • От 40 до 100 столбцов для каждого представления (также будет меняться с каждым патчем)
  • Базовые представления, которые повторно используются в других представлениях.

Базовые представления создаются для создания единой точки определения для столбцов, которые являются общими для других представлений. Это прекрасно работает, если вычисляемые столбцы меняют значение, но не работает, если столбцы удалены или добавлены. Так как я не могу использовать SELECT * FROM потому что иногда представления используются дважды (представьте себе пользователя отправителя и пользователя получателя для просмотра сообщения).

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

Есть ли способ автоматического добавления столбцов во все зависимые представления, когда я добавляю столбец в базовое представление? Было бы замечательно, если бы я мог добавить к столбцам псевдоним, который я даю представлению, но я не могу. Как сделать это ремонтопригодным?

1 ответ

Вы можете включить SCHEMABINDING на все ваши взгляды. Это не сделает ничего "автоматическим", но, по крайней мере, помешает вам забыть обновить что-либо:

create table dbo.T1 (ID int not null)
go
create view dbo.V1
with schemabinding
as
    select ID from dbo.T1
go
create view dbo.V2
with schemabinding
as
    select ID from dbo.V1
go
alter view dbo.V1
with schemabinding
as
    select ID,ID+1 as ID2 from dbo.T1

Производит:

Msg 3729, Level 16, State 3, Procedure V1, Line 1
Cannot ALTER 'dbo.V1' because it is being referenced by object 'V2'.

Я не могу изменить V1 пока я (временно) не удалю V2 (и любые другие взгляды, которые зависят от этого). Это также означает, что метаданные отслеживания зависимостей сохраняются, что позволяет заранее найти зависимости:

select distinct OBJECT_NAME(object_id)
from sys.sql_dependencies
where OBJECT_NAME(referenced_major_id) = 'V1'

Производит:

V2
Другие вопросы по тегам