Visual Studio 2010 развертывает представления слишком поздно в процессе развертывания - PullRequest
0 голосов
/ 05 мая 2010

У меня есть проект базы данных в моем решении VS2010. Недавно я изменил представление и изменил ряд функций, чтобы использовать это представление вместо перехода непосредственно к таблице. Но теперь при развертывании я получаю ошибки по большинству этих функций, потому что запрашиваемый столбец еще не существует в представлении. Обновление представления происходит позже, чем обновление UDF. Есть ли способ изменить это поведение? Лучше всего было бы, если бы скрипт развертывания обновлялся в следующем порядке: таблицы, представления, SP и UDF. Похоже, таблицы сначала обновляются, но представления просто добавляются где-то посередине сценария развертывания.

1 Ответ

2 голосов
/ 05 мая 2010

Поскольку UDF могут использоваться в представлениях, а представления могут использоваться в UDF, потребуется проанализировать все из них, чтобы определить согласованный порядок развертывания - потребуется проанализировать весь SQL. И кто знает, что делать, если у вас есть зависимости от других баз данных.

Редактировать

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

Редактировать 2

Даже незнакомец, оказывается, он делает анализ зависимостей. Глядя на выходной файл .dbschema для проекта db, я вижу, что он создает элемент для функции, который отображает список / столбцы, от которых зависит. Но сценарий развертывания sql все еще помещает представление позже. Любопытно.

Редактировать 3

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

create table dbo.T1 (
    ID int not null,
    C1 varchar(10) not null,
    C2 varchar(10) not null,
    C3 varchar(10) not null
)
go
create view dbo.V1
with schemabinding
as
    select ID,C1,C2
    from dbo.T1
go
create function dbo.F1()
returns table
with schemabinding
as
    return select ID,C1,C2 from dbo.V1 where ID=1
go
alter view dbo.V1
with schemabinding
as
    select ID,C1,C3
    from dbo.T1
go
alter function dbo.F1()
returns table
with schemabinding
as
    return select ID,C1,C3 from dbo.V1 where ID=1
go

результат:

Msg 3729, Level 16, State 3, Procedure V1, Line 4
Cannot ALTER 'dbo.V1' because it is being referenced by object 'F1'.
Msg 207, Level 16, State 1, Procedure F1, Line 5
Invalid column name 'C3'.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...