2013-12-07 34 views
0

這是我第一次在這裏問一個問題,我已經得到了許多答案,只是瀏覽我的問題 - 儘管如此,謝謝大家,但這次我被卡住了。SQL Server - 更新底層表記錄來自查看AFTER INSERT

我大部分都是SQL新手,所以對我很感興趣,我也在使用不是由我設計的SQL Server 2008 R2數據庫,我只是試圖從其它數據中獲取數據,我也使用SQL Server管理工作室(SSMS)。

SETUP:有許多表,但在這種情況下,我正在使用一個主要特定的Items表和其他5個「連接」表以及從這些表創建的視圖。然後,我使用我熟悉的MS Access中的視圖,我在主表中添加了一些新列,其中一個我想根據主表的值存儲特定Item的計算MachineRate(相同記錄)和其他表格。我能夠在視圖上完成所有這一切。

但我的問題是這樣的:是否有可能將此計算值用作主表的默認值,還是使用觸發器在其中觸發?

我已經嘗試函數和觸發器,並開始懷疑這是行不通的,並且如前所述視圖基於我想要插入值的表。

對於離(這只是部分):主表有以下幾列...

RecID, PartRef, Material, Width, Length, Thickness, MachRate etc 

而且MachineRate

RecID, Rate 

而且TableOfTech

RecID, Material, Thickness1, Thickness2, AddToMachRate etc... 

那些我的計算值需要5個表中的3個,主表的MachRate值需要(價格從MachineRate + AddToMachRate從TableOfTech),其中TableOfTech.Material = MainTable.Material和TableOfTech.Thickness1和Thickness2

之間MainTable.Thickness

不知道有多少除權:確實有幫助,但給ü一個想法我正在處理,所以它真的工作插入到表格列中只有插入的新記錄...基於同一個表中的視圖值?

我更好地解釋了爲什麼我想這樣做....在這種情況下,用戶有必要能夠更改該值,但大多數情況下,默認值是可以的,我們正在使用它此刻

我希望這對你們有意義,我期待着任何幫助!

S.布魯貝克

+0

*您可能*在視圖中創建INSTEAD OF INSERT'的'扳機,因此,如果在該視圖的'INSERT'發生時,你得到的「通知」,然後你可以決定如何處理這些值插入辦該視圖 - 如何將它們存儲到底層表中 –

+0

marc,感謝您的回覆 - 我已經使用了替代插入觸發器,但我在表格字段中獲取了默認值,我在列上設置了默認值因爲它不允許空值,只是在測試時,請參閱下面 ALTER TRIGGER [DBO]。[trg_PopMachRateSQL] ON dbo.Qry_AllParts2 INSTEAD OF INSERT AS BEGIN UPDATE dbo.PPRR_PPRR_00000100 SET dbo.PPRR_PPRR_00000100.MachRateSQL = UseRat e FROM插入的AS i WHERE dbo.PPRR_PPRR_00000100.RecID = i.RecID END –

+0

穆罕默德阿里 不確定我是否在正確的位置張貼/回覆...? 我知道你在說什麼,但我想要的是確保值永遠不會改變,除非我在Access中運行更新查詢,換句話說,如果我曾經將其中的一個數據更改爲2個有數據的表對於計算列我想彈出一個消息框,詢問是否需要根據我的機器速率更改來更新主項記錄 也許我沒有想過所有的東西? –

回答

0

在你有一個表中的計算列,最好保持所有從價值被計算了在同一個表這個計算的列,其中列的情況。

您可以計算來自其他表的列的whos值,但您必須在計算該值的所有表上創建INSTEAD OF INSERT triggers, AFTER UPDATE, AFTER DELETE觸發器,以同步源表中所有更改的計算列,這可能是一個任務的地獄,觸發器有時可以成爲沉默的殺手。

因此,爲了避免這一切麻煩只是不停地從被計算出的值,其中列在一個表中的計算列它的自我。

另一種更簡單的選擇將是創建另一個view其從這些多個基礎表的運行時間收集數據,並在運行時爲你計算它們。由於您已經從您的數據庫中獲取了正在計算此列的數據,因此只有在希望查看計算結果時才能在運行時計算它們。

如果你有大量的數據在基礎表,並計算它們值在運行時需要大量的時間,然後考慮INDEXED VIEWS

我的建議是避免儘可能到有,你有多個表中的計算列和源列的情況。