我需要修改約。 24巨大的UDP和生產部署我需要做一個BEGIN TRANSACTION/ROLLBACK/COMMIT PROCESS。ALTER PROCEDURE WITH TRANSACTION
如何在BEGIN TRANSACTION和COMMIT或ROLLBACK之間添加ALTER PROCEDURE my_proc
?
注意:EXEC('ALTER PROCEDURE..')
可以不是被實施。
感謝
更新:有一種方法來改變一個過程,如果失敗回滾?
我需要修改約。 24巨大的UDP和生產部署我需要做一個BEGIN TRANSACTION/ROLLBACK/COMMIT PROCESS。ALTER PROCEDURE WITH TRANSACTION
如何在BEGIN TRANSACTION和COMMIT或ROLLBACK之間添加ALTER PROCEDURE my_proc
?
注意:EXEC('ALTER PROCEDURE..')
可以不是被實施。
感謝
更新:有一種方法來改變一個過程,如果失敗回滾?
(萊昂德羅,我加入一個新的答案,因爲這將是一個compent太長)
我一直在思考。我不認爲這是我將實施的解決方案,但根據您的要求(特別是您的限制),這是一個可行的想法:
sys.objects目錄上有一個modify_date,爲什麼不在運行更新之前存儲所有對象的日期,並與運行更新後的日期進行比較。如果所有日期不同,則意味着所有日期都已正確更新,如果其中一個日期相等,則表示發生故障,然後運行回滾腳本(您將需要回滾代碼,並非易事)如剛纔輸入的ROLLBACK)
這是一個非常好的解決方法! – 2012-02-08 12:26:50
爲什麼你不能經常的方式。
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
)。然後,您可以決定批處理是否全部成功並提交或回滾。
'TRY ... CATCH'不能跨越批次,但OP沒有提及'TRY ... CATCH'。 – 2012-02-07 17:20:04
我不明白這個答案,我不想創建一個程序,我需要做一個改變過程。另外它失敗了,因爲'CREATE/ALTER PROCEDURE'必須是查詢批處理中的第一條語句。 – 2012-02-07 17:33:57
@Leandro:我猜,Diego的代碼片段中的'CREATE PROCEDURE ...'只是一個例子,您可以使用'ALTER ...'代替。至於你的其他觀點,這個例子滿足了這個要求:'CREATE PROCEDURE' *是第一個語句,因爲它遵循'GO',這是一個批量分隔符。 – 2012-02-08 06:47:11
如果你不能使用動態sql,那麼你不能。動態sql的限制是什麼? – JNK 2012-02-07 17:06:28
部署團隊不能在生產中執行EXEC – 2012-02-07 17:30:31
然後你不能這樣做。期。動態SQL是完成您的工作的唯一方法。 – JNK 2012-02-07 17:41:08