簡體   English   中英

如何更新SQL Batch?

[英]How to update SQL Batch?

在我的客戶端,他們有一個數據庫。 完成數據庫的增量更改后,我在一個SQL文件中准備了SQL對象更改列表。

腳本是這樣的:

If sql object 1 present in database 
   DROP the SQL object 1
GO

create the SQL Object 1 

If sql object 2 present in database 
   DROP the SQL object 2

create the SQL Object 2

我一直放棄現有的Object並重新創建它。

現在這批可能包含一些錯誤。

我的要求是,如果文件中有任何錯誤。 已重新創建非sql對象。 它應該回滾舊的sql對象。

如果沒有錯誤,那么它將創建所有SQL對象。

由於中間的GO語句,我無法在sql中使用TRANSACTION。

怎么解決這個問題?

那么不要使用GO 只需從腳本中刪除它,然后在需要的地方添加BEGINCOMMIT TRANSACTION命令。

BEGIN TRAN

   IF EXISTS Object1
   BEGIN
        DROP Object1;
   END 
   CREATE Object1;

   IF EXISTS Object2
   BEGIN
        DROP Object2;
   END 
   CREATE Object2;

COMMIT TRAN

通過DROP / CREATE修改數據庫模式有許多問題:

  • 它可能會丟失數據
  • 它會丟失添加到被刪除對象的權限和擴展屬性
  • 交叉對象依賴項(例如,外鍵)需要一定的drop / create順序

通常最好嘗試將對象從模式版本更改為模式版本。 這需要您了解當前部署的模式版本,但該問題很容易解決(使用數據庫擴展屬性,請參閱版本控制和數據庫 )。

回到你的問題,一個天真的方法是將你的整個腳本包裝在一個大的BEGIN TRAN / COMMIT中但很少有效:

  • 它創建了一個需要大量日志空間的潛在大型事務。
  • 結果是無法驗證,直到提交為時已晚,無法做任何事情
  • 混雜異常和交易的行為充其量是混亂的。 XACT_ABORT ON某種程度上有所幫助,但只有這么多。
  • 並非所有DLL語句都可以在事務內部運行

對於這些resons,我建議采用一種更簡單,更安全的方法:在修改模式之前,先備份數據庫WITH COPY_ONLY 如果出現任何問題,請回滾到副本。 或者,數據庫快照可用作備份。 請參見如何:將數據庫還原為數據庫快照

請注意,BEGIN TRAN / COMMIT可以跨越批次(即可以由多個GO分隔),因此您的問題不是問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM