您是否可以在事务中修改SQL DB模式以了解是否已应用所有更改?

时间:2010-05-04 20:17:11

标签: sql tsql transactions

作为我的(新)数据库版本控制方法的一部分,我正在编写一个“更改脚本”,并希望更改脚本在脚本成功执行时将新行插入SchemaChangeLog表,或者如果反向更改则脚本中的任何单个更改都会失败。

是否可以在事务中进行模式更改,并且只有在提交时才进行INSERT?

例如(伪代码,我对SQL不太好):

SET XACT_ABORT ON
BEGIN TRANSACTION
PRINT 'Add Col2 to Table1'
IF NOT EXIST (SELECT * FROM sys.columns WHERE NAME='Col2' AND object_id=OBJECT_ID('Table1'))
BEGIN
    ALTER TABLE [dbo].[Table1]
    ADD Col2 int NULL
END
INSERT INTO SchemaChangeLog(MajorVer, MinorVer, PointVer, ScriptName, AppliedDate) VALUES(N'01', N'01', N'0000', N'update.01.01.0000.sql', GETDATE())
COMMIT TRANSACTION

1 个答案:

答案 0 :(得分:1)

如果您希望将两个操作设为原子操作,请将它们嵌入到事务中。所以你的两个动作是1)ALTER TABLE和2)INSERT INTO SchemaChangeLog。因此,您的BEGIN TRANSACTION必须发生在ALTER TABLE之前,而COMMIT 发生在 INSERT之后。

作为旁注,SQL Server中有一个已经内置的机制用于跟踪架构更改,它开箱即用,最好的是它会捕获每个人的更改,而不是只有你自己:Event Notifications