2010-05-05 140 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