作为我的(新)数据库版本控制方法的一部分,我正在编写一个“更改脚本”,并希望更改脚本在脚本成功执行时将新行插入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
答案 0 :(得分:1)
如果您希望将两个操作设为原子操作,请将它们嵌入到事务中。所以你的两个动作是1)ALTER TABLE和2)INSERT INTO SchemaChangeLog。因此,您的BEGIN TRANSACTION必须发生在ALTER TABLE之前,而COMMIT 发生在 INSERT之后。
作为旁注,SQL Server中有一个已经内置的机制用于跟踪架构更改,它开箱即用,最好的是它会捕获每个人的更改,而不是只有你自己:Event Notifications。