2010-05-05 101 views
0

我的VS2010解决方案中有一个数据库项目。我最近改变了一个视图,并改变了一些函数来使用这个视图,而不是直接对着一个表。 但是现在,当我部署时,我在大多数这些功能上遇到错误,因为视图中没有存在该列所要求的列。 视图更新晚于UDF更新发生。有什么方法可以改变这种行为吗? 如果部署脚本按此顺序更新,那么最好的办法就是:表,视图,SP和UDF。似乎首先更新了表,但视图只是在部署脚本中间的某处引发。Visual Studio 2010在部署过程中部署视图太迟

回答

2

由于可以在视图中使用UDF,并且可以在UDF中使用视图,它必须分析所有这些以确定一致的部署顺序 - 它必须解析所有的SQL。谁知道如果你对其他数据库有依赖性该怎么办。

编辑

有没有记录/支持的方式来强制部署顺序,到目前为止,我所看到的。通过一些最小的测试,在我看来,UDF(至少是表值)总是在视图之前部署。

编辑2

更奇怪的是,事实证明它确实做到了依赖性分析。查看db项目的.dbschema输出文件,我可以看到它为该函数生成了一个< Relationship Name =“BodyDependencies”>元素,该元素列出了它所依赖的视图/列。但是部署sql脚本仍然会在稍后放置视图。好奇。

编辑3

也许最终编辑。总的来说,我认为问题无法解决。 (不可否认,因为我已经指定了模式绑定,因此只有以下错误)。如果旧的函数定义依赖于旧的视图定义,而新的函数定义依赖于新的视图定义,还有用改变来改变数据库中没有正确的方式:

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'. 
+0

我看到......我没有意识到在视图中使用UDF,但的确如此,你可以在视图中使用标量或UDF而不带参数。 但有没有办法让部署在UDF之前运行我的视图更新?因为我知道它会更新并且没有任何其他依赖关系。但我不想在每个数据库上进行manuelly更新。 – Markus 2010-05-05 07:27:13

+0

即使这不是一个解决方案,但它是一个现在无法解决的答案。太糟糕了。谢谢你的协助。 猜猜我会做一些预部署检查,而不是这样解决。 – Markus 2010-05-05 08:40:11