校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 數據庫安裝包和升級包腳本工具RedGate使用介紹

數據庫安裝包和升級包腳本工具RedGate使用介紹

熱門標簽:漯河電銷回撥外呼系統 美國地圖標注軟件下載 怎么修改高德地圖標注 電話機器人怎么看余額 長沙外呼系統平臺 城市地圖標志怎么標注 西安電話自動外呼系統 合肥crm外呼系統加盟 硅基電話機器人官網

這篇日志記錄一下我在公司所學習到的數據庫安裝包的設計。正好這些內容也是我最近工作遇到的一些問題,在此記錄并分享一下。

  在產品的開發和版本更新過程中,數據庫的結構難免會一直發生變化。為了盡量減少升級時的工作量,設計一個好的數據庫升級方式就顯得很重要。在設計數據庫安裝包時,既要考慮到全新安裝時如何生成默認數據,也要考慮從老版本升級時舊的數據如何遷移如有必要)。

基本上,安裝包可以分成三個部分:Pre-script,數據庫安裝或升級和Post-script。

一、數據庫安裝或升級

  首先,我們使用到的是Red Gate工具。這個工具會自動比較現有數據庫和目標數據庫在結構上的差異,并自動生成一個腳本進行升級(實際上是執行一連串的SQL語句)。這是個很好的工具,推薦使用(好像要收錢),可以減少很多的工作量。

  如果Red Gate發現目標表在舊版本的數據庫不存在,它會自動創建這個表并設置好主鍵、外鍵和其他約束。這個沒什么要說的。

  如果目標表已經存在,那么就會對原有的表進行更新,在此要特別注意要更改的表結構如何變化。舉個例子:

  我們原來有一張UserParameter表,結構如下:

  現在,我們希望增加一個ParameterType字段,與UserId字段構成聯合主鍵: 


此時,如果舊版本的數據庫有數據,在升級過程中添加新字段后由于ParameterType為空,會導致表的結構修改失敗,這樣安裝包就會出錯。

  解決方法是為這個字段加一個默認值。一般做法是在數據庫項目的Schema Objects – Tables – Contraints下加一個Default Constraint的約束:

復制代碼 代碼如下:

ALTER TABLE [TMS].[UserParameters]
   ADD CONSTRAINT [DF_UserParameters_Type]
   DEFAULT N'SU'
   FOR [ParameterType]

二、Pre-script和Post-script

 一般來說,大部分數據表的結構變化都可以又RedGate自動完成,我們要做的只是注意設置好默認值即可。但還有一些其他情況需要自行書寫腳本來完成,這里舉幾個例子。


1.默認數據
  默認數據是在數據庫創建完后加上的。我們可以在Post-script中加一個名為DefaultData.sql的腳本,范例如下:

復制代碼 代碼如下:

SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN TRANSACTION
-- New default for FloorAlertOrder
IF NOT EXISTS (SELECT 1 FROM TMS.[FloorAlertOrder] WHERE [ModeId] = 1 and [TypeId] = 7)
   INSERT INTO [TMS].[FloorAlertOrder] ([TypeId], [Ordinal], [ModeId]) VALUES (7, 10, 1)

-- TMS.User

IF NOT EXISTS (SELECT 1 from [TMS].[User] where XRef = 'Host')
    INSERT INTO [TMS].[User]
           ([Active]
           ,[XRef]
           ,[LastName]
           ,[FirstName]
           ,[UserName]
           ,[CreationTime]
           ,[Dealer]
           ,[CasinoHost]
           ,[DomainName]
           ,[CMSUserName])
     VALUES
           (1
           ,'Host'
           ,'Host'
           ,'Host'
           ,'Host'
           ,GETUTCDATE()
           ,0
           ,0
           ,'Host'
           ,'Host')
COMMIT TRANSACTION
GO

這個腳本唯一要考慮的就是數據庫不一定是空的,可能是升級來的,所以就需要判斷一下原來有沒有數據。另外在寫這些腳本時最好放在事務中,安裝失敗時可以把未提交的數據撤銷掉,這樣用戶在排查了問題之后就可以直接重新再安裝一次。

2. 某個字段發生變化

  比如我們有一張Rating表,里面有一個TerminalId字段,原來是VARCHAR類型,記錄的是機器名。現在我們的新版本把這個字段的類型改成int類型,并加一個關聯到Terminal表的外鍵約束。針對這種情況,就需要我們自己寫一個腳本了。

  首先肯定不能放在Post-script里。在安裝數據庫的過程中,安裝程序會嘗試把字段改成int類型并加上外鍵約束,如果數據庫里本身有數據,會導致轉換成int失敗或者外鍵約束不成立。

  為此,我們可以在Pre-script里面,把這些數據首先在Terminal表中查出來并更新:

復制代碼 代碼如下:

BEGIN TRANSACTION
BEGIN TRY
 
IF EXISTS(select 1 from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'Rating' and COLUMN_NAME = 'TerminalId' and DATA_TYPE = 'varchar')
BEGIN
 
    DECLARE @defaultTerminalId NVARCHAR(64) = (SELECT TOP 1 TerminalId FROM TMS.Terminal ORDER BY TerminalId ASC)
 
    UPDATE r
    SET r.TerminalId = ISNULL(t.TerminalId, @defaultTerminalId)
    FROM TMS.Rating r
    LEFT JOIN TMS.Terminal t ON r.TerminalId = t.NAME
 
END
    COMMIT TRANSACTION
END TRY
 
BEGIN CATCH
    IF @@TRANCOUNT > 0 ROLLBACK
END CATCH
 
GO


最開始,我們還是要考慮到多種情況:如果是從老版本升級,那么TerminalId字段的類型就是varchar,此時需要進行轉換。如果不是(比如全新安裝;或是上一個版本已經轉換成int了,下一個版本時這個Pre-script還是會執行,所以也要考慮這種情況),就進行轉換。

  腳本中,直接把查詢到的Terminal表的TerminalId更新到Rating表中,找不到的用默認值代替(int可以轉換成varchar,如果寬度足夠的話;此外,該列也可以為NULL值)。這樣,執行完這個Pre-script后就已經是目標值了,剩下的列的類型轉換和外鍵約束就交給Red Gate即可。

  UPDATE語句也可以Join其他表,這一點很有意思,大家可以學習一下這條語句。

  3. 某張表被刪除了

  如果有一張表不需要了,那么Red Gate會直接把它刪掉。但如果這些數據還需要(比如存到別的系統中了),就要用Pre-script把這些數據存到別的地方去,否則安裝完后在Post-script執行前表和數據就都沒有了。

  比如我們有一張UserCard表,新版本中這些數據是由另一個系統負責,為此我們需要把這些數據轉移到另一個系統中去。

  可以指定Red Gate升級的Schema類型,比如我們這只管TMS下的所有表,對于其他schema下的表直接忽略。利用這一點,可以在Pre-script中將這些數據移到dbo下:

復制代碼 代碼如下:

-- Backup UserCard data, so that we could transfer them to SBDB when installing TMS
 
BEGIN TRANSACTION
BEGIN TRY
 
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'TempUserCard' AND TABLE_SCHEMA = 'dbo')
    DROP TABLE [dbo].[TempUserCard]
 
CREATE TABLE [dbo].[TempUserCard] (UserCardId BIGINT NOT NULL, UserId BIGINT NOT NULL, CardInfo NVARCHAR(256) NOT NULL)
 
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'UserCard' AND TABLE_SCHEMA = 'TMS')
BEGIN
 
    INSERT INTO [dbo].[TempUserCard]
        SELECT UserCardId, UserId, CardInfo FROM [TMS].[UserCard]
 
END
 
COMMIT TRANSACTION
END TRY
 
BEGIN CATCH
    IF @@TRANCOUNT > 0 ROLLBACK
END CATCH
 
GO

 這樣,在數據庫安裝完后,數據就在dbo.TempUserCard表中。這時在其他組件的安裝程序、或者Post-script、或者其他系統中就可以把這些表轉移過去。

  使用這種設計應該能應對大多數情況,當然我們在設計數據庫的結構時就應該盡量考慮周全,以免頻繁修改數據表的結構造成Pre-script和Post-script非常多且亂。在確認某些script用不到的情況下,我們也可以把它刪除掉。

您可能感興趣的文章:
  • 5個常用的MySQL數據庫管理工具詳細介紹
  • 批處理寫的 oracle 數據庫備份還原工具

標簽:撫順 文山 瀘州 廣西 吉林 玉溪 商洛 濟源

巨人網絡通訊聲明:本文標題《數據庫安裝包和升級包腳本工具RedGate使用介紹》,本文關鍵詞  數據庫,安裝,包,和,升級,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《數據庫安裝包和升級包腳本工具RedGate使用介紹》相關的同類信息!
  • 本頁收集關于數據庫安裝包和升級包腳本工具RedGate使用介紹的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    91精品一区二区三区久久久久久| 欧美日韩黄视频| 91老师国产黑色丝袜在线| 日韩一区二区三区在线视频| 亚洲观看高清完整版在线观看| av在线不卡免费看| 亚洲品质自拍视频网站| 91视频国产观看| 亚洲高清免费观看高清完整版在线观看 | 在线观看一区二区视频| 亚洲成人免费在线| 精品国产百合女同互慰| 成人av在线播放网址| 视频一区二区三区中文字幕| 久久久www免费人成精品| 一本色道亚洲精品aⅴ| 久久精品国产精品亚洲红杏| 国产精品久久久久影院| 666欧美在线视频| 99久久伊人久久99| 亚洲福中文字幕伊人影院| 精品久久国产老人久久综合| 91丨porny丨首页| 久久99久久精品| 亚洲一级二级三级在线免费观看| 久久天堂av综合合色蜜桃网| 欧美日韩亚洲综合在线| 成人av网站在线观看免费| 蜜桃视频在线观看一区| 亚洲美女一区二区三区| 久久久久久一二三区| 91精品国产麻豆| 欧美性感一区二区三区| 成人综合婷婷国产精品久久 | 国产精品视频一二三| 日韩欧美卡一卡二| 欧美日韩日日摸| 色婷婷精品大在线视频| 成人avav在线| 国产成人免费视| 极品销魂美女一区二区三区| 日韩精品一级二级| 亚洲午夜久久久| 玉米视频成人免费看| 亚洲视频1区2区| 中文字幕在线不卡| 国产亚洲精品7777| 国产免费成人在线视频| 久久这里都是精品| 久久婷婷一区二区三区| 国产欧美日韩在线| 国产女人aaa级久久久级| 欧美激情艳妇裸体舞| 久久先锋影音av| 2020日本不卡一区二区视频| 久久综合99re88久久爱| 国产性做久久久久久| 国产精品三级视频| 亚洲欧美自拍偷拍| 亚洲精选视频在线| 天天色综合成人网| 久草这里只有精品视频| 久久99热这里只有精品| 国产精品456| 91亚洲精品一区二区乱码| 色偷偷88欧美精品久久久| 在线亚洲精品福利网址导航| 欧美男生操女生| 日韩视频一区二区三区在线播放| 欧美视频一区二区三区在线观看| 欧美色男人天堂| 日韩女优av电影| 久久一区二区三区四区| 国产午夜精品福利| 亚洲另类在线视频| 日韩av成人高清| 国产精品一二三四| 91美女视频网站| 91丨porny丨户外露出| 337p亚洲精品色噜噜| 久久日韩精品一区二区五区| 亚洲欧洲99久久| 蜜臀av性久久久久av蜜臀妖精| 国产伦精一区二区三区| 色偷偷成人一区二区三区91 | 一本色道久久综合狠狠躁的推荐 | 欧美国产激情一区二区三区蜜月| 亚洲国产电影在线观看| 亚洲精品视频在线| 久久不见久久见免费视频7| 91视频国产观看| 欧美精品一区二区三区一线天视频 | 夜夜精品视频一区二区| 麻豆成人久久精品二区三区小说| 成人av手机在线观看| 日韩一区二区不卡| 中文字幕国产一区| 日本成人在线看| 97精品电影院| 精品免费99久久| 亚洲一区二区三区四区在线观看 | 日本韩国欧美一区二区三区| 日韩美女主播在线视频一区二区三区| 国产精品麻豆99久久久久久| 久久精品国产999大香线蕉| 91福利在线导航| 久久久国产精品午夜一区ai换脸| 一区二区在线电影| 成人h精品动漫一区二区三区| 欧美日韩久久一区| 一区二区三区视频在线看| 国产大片一区二区| 日韩欧美自拍偷拍| 污片在线观看一区二区| 欧美综合一区二区| 国产精品久久久久久久久快鸭| 久久99久国产精品黄毛片色诱| 欧美精品在线一区二区三区| 亚洲色图色小说| 成人av电影在线观看| 久久久久久久网| 国产自产2019最新不卡| 欧美成人猛片aaaaaaa| 日本中文一区二区三区| 欧美日韩国产高清一区二区三区| 亚洲激情在线激情| 91蝌蚪porny九色| 亚洲激情六月丁香| 欧美亚洲动漫精品| 亚洲电影一级黄| 欧美美女bb生活片| 日韩电影免费在线观看网站| 51久久夜色精品国产麻豆| 日韩精品亚洲专区| 日韩欧美亚洲国产另类| 国产精品一卡二| 中文字幕一区二区三区四区不卡 | 成人久久视频在线观看| 国产精品国产精品国产专区不蜜| 国产剧情在线观看一区二区| 久久久久久夜精品精品免费| 成人av在线资源网| 一级精品视频在线观看宜春院| 欧美日韩国产片| 狠狠色狠狠色综合系列| 中文字幕国产精品一区二区| 色综合婷婷久久| 午夜精品久久久久久久久| 日韩欧美电影一二三| 粉嫩一区二区三区性色av| 中文字幕在线观看一区二区| 91老司机福利 在线| 丝袜亚洲另类欧美综合| 精品日韩在线一区| 成人午夜碰碰视频| 亚洲伊人色欲综合网| 91精品国产欧美一区二区18| 国产经典欧美精品| 一区在线播放视频| 欧美一区二区在线不卡| 国产成人免费视频网站| 天堂av在线一区| 国产日韩成人精品| 在线综合亚洲欧美在线视频| 国产盗摄精品一区二区三区在线| 亚洲国产视频网站| 久久九九久精品国产免费直播| hitomi一区二区三区精品| 日韩成人精品视频| 亚洲男同性恋视频| 久久久亚洲欧洲日产国码αv| 在线观看日韩高清av| 国产盗摄女厕一区二区三区| 婷婷久久综合九色综合绿巨人| 久久久精品国产免大香伊| 欧美日韩国产经典色站一区二区三区| 国产成人aaa| 蜜臀91精品一区二区三区 | 国产精品一区二区视频| 亚洲综合免费观看高清完整版| 欧美精品一区二区三区视频| 欧美日韩另类一区| 97精品视频在线观看自产线路二| 国内精品久久久久影院一蜜桃| 一区二区三区免费在线观看| 国产色综合一区| 精品国产乱码91久久久久久网站| 91国产免费看| 91片在线免费观看| 99国产精品久| 成人久久18免费网站麻豆| 国产乱人伦偷精品视频不卡| 久色婷婷小香蕉久久| 日韩电影免费在线看| 天堂成人国产精品一区| 视频在线观看国产精品| 性久久久久久久久| 亚洲成a人v欧美综合天堂| 一区二区三区视频在线观看| 精品国产免费久久|