2012-02-07 79 views
0

我需要修改約。 24巨大的UDP和生產部署我需要做一個BEGIN TRANSACTION/ROLLBACK/COMMIT PROCESS。ALTER PROCEDURE WITH TRANSACTION

如何在BEGIN TRANSACTION和COMMIT或ROLLBACK之間添加ALTER PROCEDURE my_proc

注意EXEC('ALTER PROCEDURE..')可以不是被實施。

感謝

更新:有一種方法來改變一個過程,如果失敗回滾?

+1

如果你不能使用動態sql,那麼你不能。動態sql的限制是什麼? – JNK 2012-02-07 17:06:28

+0

部署團隊不能在生產中執行EXEC – 2012-02-07 17:30:31

+1

然後你不能這樣做。期。動態SQL是完成您的工作的唯一方法。 – JNK 2012-02-07 17:41:08

回答

1

(萊昂德羅,我加入一個新的答案,因爲這將是一個compent太長)

我一直在思考。我不認爲這是我將實施的解決方案,但根據您的要求(特別是您的限制),這是一個可行的想法:

sys.objects目錄上有一個modify_date,爲什麼不在運行更新之前存儲所有對象的日期,並與運行更新後的日期進行比較。如果所有日期不同,則意味着所有日期都已正確更新,如果其中一個日期相等,則表示發生故障,然後運行回滾腳本(您將需要回滾代碼,並非易事)如剛纔輸入的ROLLBACK)

+0

這是一個非常好的解決方法! – 2012-02-08 12:26:50

1

爲什麼你不能經常的方式。

BEGIN TRANSACTION 
GO 

CREATE PROCEDURE testProcedure 
AS 
    SELECT 1 
GO 

SELECT OBJECT_ID('testProcedure') ObjectID --this will return the object ID 
GO 

rollback TRANSACTION 

SELECT OBJECT_ID('testProcedure') ObjectID --this will return NULL because the proc creation was rolled back 
GO 

圍繞批次不能有BEGIN TRY和BEGIN CATCH。但是,您可以使用最後一批檢查以前的所有步驟是否成功(例如,通過檢查目錄視圖,例如sys.objects)。然後,您可以決定批處理是否全部成功並提交或回滾。

+1

'TRY ... CATCH'不能跨越批次,但OP沒有提及'TRY ... CATCH'。 – 2012-02-07 17:20:04

+0

我不明白這個答案,我不想創建一個程序,我需要做一個改變過程。另外它失敗了,因爲'CREATE/ALTER PROCEDURE'必須是查詢批處理中的第一條語句。 – 2012-02-07 17:33:57

+0

@Leandro:我猜,Diego的代碼片段中的'CREATE PROCEDURE ...'只是一個例子,您可以使用'ALTER ...'代替。至於你的其他觀點,這個例子滿足了這個要求:'CREATE PROCEDURE' *是第一個語句,因爲它遵循'GO',這是一個批量分隔符。 – 2012-02-08 06:47:11

相關問題