2015-09-28 36 views
2

我有一個包含行的表。我正在使用SQL數據庫項目來管理數據庫,並且我想通過向此表添加新的NOT NULL列來升級架構,該列附帶對新表的FK約束(也包含在新版本的項目)。在數據庫項目的新表上創建非空FK

這可能嗎?我知道我可以使用該選項爲新的FK列生成智能默認值,但這沒有幫助,因爲我沒有機會將任何行放入由FK引用的新表中。

我有什麼選擇?由於預部署腳本在AFTER之後執行模式比較,因此我無法在此處創建新表,因爲比較先運行並確定需要創建表 - 當腳本到達腳本中的這一點時會發生這種情況並認爲已經存在(預先部署中創建)表

回答

2

我們的解決方案:

在部署前腳本中創建新的臨時表並在其中移動所需的數據。在部署後腳本中,我們從此臨時表中讀取數據並更新其他表。因此,您不會干涉數據庫部署,並擁有恢復引用所需的全部數據。是的,我同意,這很醜陋。

+0

我不認爲這會工作。實際的發佈過程仍然會嘗試1 /創建一個新表2 /在現有表上創建一個新列,並且3在新表上爲新列創建一個FK。這將失敗,因爲即使使用智能默認設置,FK也不會被滿足,因爲1 /中的新表是空的 –

+0

@SimonGreen它的工作原理,數據庫項目檢查腳本後的約束(和外鍵) – Backs

+0

好悲傷,所以他們做!是的,這改變了一切。我必須假定後發佈腳本在主發佈腳本中的所有內容之後運行......但是,我可以在新表中插入需要的記錄,並在我的新FK列中設置所需的值所有發生在FK限制被施加之前......簡單!非常感謝 –

3

有我所看到的3種方法:

  1. 使用預比較腳本,你想要做什麼運行sqlpackage.exe前(或者你用來部署的任何東西),它工作得很好,通常很容易在比較之前添加一個額外的「運行此腳本」(https://the.agilesql.club/Blog/Ed-Elliott/Pre-Compare-and-Pre-Deploy-Scripts-In-SSDT)。

  2. 做一個分階段部署,所以在第一個版本添加一個默認約束和糾正現有的數據,然後在以後的版本中有沒有空約束

  3. 你可以寫你自己的強制執行使用部署貢獻者進行更新。

我個人使用1和2,選擇3似乎有點大材小用(PS我沒有忘記餐桌重寫問題)

+0

嗨,是的,到目前爲止我已經選擇了1.我不能在VS中使用右鍵單擊 - >發佈選項了,我有一個.bat文件,我運行命令提示符對它。這是一個真正的恥辱,你不能以更多的VS整合的方式做到這一點,我覺得這是一個功能嚴重的遺漏....但現在看起來這是正確的(唯一的)答案 –

+0

嗨 - 我做類似的東西,我使用powershell腳本來驅動sqlpackage.exe和其中一個快速部署者來幫助紅色,綠色,測試,dev,否則完整的構建和部署對我來說太慢了。 powershell腳本與我在CI/Prod中用於部署或生成腳本的功能相同,因爲它們得到了很好的測試:) –

+0

請參閱下面的答案 - 事實證明,在FK檢查約束被施加之前,腳本部署腳本運行。所以我可以在我的新表中設置記錄,並在FK列中設置值,然後檢查FK約束... –