我有點困惑,需要您的幫助。我有一個擁有超過150個表的數據庫。我有幾個字段應該支持Unicode,但現在他們不用,因此我想在此過程中將列數據類型更改爲ntext和nvarchar,我必須刪除約束然後再次創建它們。放棄約束並重新創建它是否安全?是否可以安全地刪除,然後在數據庫中創建約束條件
*我有286列改變,只是不知道在這個過程中必須刪除和創建許多約束。
*我想知道的是,改變完全成長的項目的列數據類型是安全的。
我有點困惑,需要您的幫助。我有一個擁有超過150個表的數據庫。我有幾個字段應該支持Unicode,但現在他們不用,因此我想在此過程中將列數據類型更改爲ntext和nvarchar,我必須刪除約束然後再次創建它們。放棄約束並重新創建它是否安全?是否可以安全地刪除,然後在數據庫中創建約束條件
*我有286列改變,只是不知道在這個過程中必須刪除和創建許多約束。
*我想知道的是,改變完全成長的項目的列數據類型是安全的。
如果你可以做到這一點,而沒有數據庫是活的,那麼它應該是安全的。要牢記的重要事項是確保您記錄了所有約束條件,它們中的任何一個都不會受列類型更改影響(或者如果它們是爲此而緩解的),並且您清楚依賴關係在這些限制之間。
我想我只是說,確保你有一個清晰的過程,並遵循它。
但還有更好的辦法:你可以禁用索引。See on msdn。這保持了索引定義。
如果您在客戶機器上運行(例如使用安裝程序),您應該將數據庫置於單用戶模式,以確保沒有應用程序正在同時插入數據。這將允許不一致的數據,並且您將無法創建/啓用索引。
編輯:(後GBN評論)
禁用它很可能不是你的情況下工作。
我們還在升級數據庫時刪除約束條件,並且通常它是保存的。其他方面已被其他方面提及:你需要全部瞭解它們才能創造它們。有從現有數據庫創建腳本的工具,或者您可以自己編寫腳本。所有的信息都應該在數據庫中。例如,你可以通過管理工作室獲取腳本,但只能一個接一個(據我所知)。
如果您在高效環境中執行此操作,則可以將數據庫置於單用戶模式,以確保沒有應用程序嘗試使用它。
所有這些都可以通過第三方比較工具以事務方式完成(全部完成或全部回滾)。也就是說,您可以在開發中單獨進行更改(使用SSMS進行更改),但會生成「安全」更改和回滾腳本(但始終有備份)。
否則,這樣做很安全:如果某人當時正在使用數據庫,並且輸入了錯誤的數據或嘗試使用沒有索引的查詢,則可能會出現問題。
第三方工具使用事務處理方法在整個更改期間鎖定對象。
當然,你可以一次做一個,而不是大爆炸,但這些工具仍然有用。
我們進行模式時刻都在變化,這是我們在一般程序:
爲每個表:
使SQL Server Management Studio中修改,你會發現,這些腳本下降並重新創建約束都沒有問題
時生成腳本,將它們複製到文件
取消更改(不要把它們應用到數據庫)
去測試/開發數據庫具有完全相同的模式生產和運行腳本
,如果您有任何錯誤,解決其中,恢復測試/開發和複試
,如果您有任何錯誤
作出必要的備份
時間表的廣告應用程式與用戶停機,如果有必要
數據庫置於單用戶模式,這將防止改變任何數據的約束缺失時
運行腳本文件
以解除數據庫的單用戶模式
相反刪除和重建的利弊您可以嘗試使用disabling and enabling them的方法。我不確定,如果這可以工作,如果你同時改變列類型,但只要你保持列名不變,這是值得的測試
而且對於所有神聖的事物的愛,先採取備份;-) – 2009-04-21 11:18:15
我想這應該不用說,在進行任何更改之前進行備份將是一個非常好的主意! – KarstenF 2009-04-21 11:18:21