更改程序与交易

时间:2012-02-07 17:04:36

标签: sql sql-server-2005

我需要修改约。 24巨大的UDP和生产部署我需要做一个BEGIN TRANSACTION / ROLLBACK / COMMIT PROCESS。

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

注意EXEC('ALTER PROCEDURE..')可以实施。

由于

更新:如果失败了,有办法改变程序和回滚吗?

2 个答案:

答案 0 :(得分: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 :(得分:1)

(Leandro,我正在添加一个新的答案,因为对于竞争对手来说太长了)

我一直在想。我不认为这是我实施的解决方案,但根据您的要求(特别是您的限制),这是一个可行的想法:

sys.objects目录中有一个modify_date,所以,为什么不在运行更新之前将日期存储在所有对象之外,并与运行更新后的日期进行比较。如果所有日期都不同,则表示所有日期都正确更新,如果其中一个日期相同,则表示一个失败,然后运行回滚脚本(您将需要回滚代码,这将不容易只需键入ROLLBACK)