执行插入,然后登录一个SQL命令

时间:2020-03-05 18:56:45  来源:igfitidea点击:

我被要求实现一些代码,这些代码将更新MS SQL Server数据库中的一行,然后使用存储的proc将更新插入历史表中。我们无法添加存储的proc来执行此操作,因为我们无法控制数据库。我知道我们可以在存储过程中进行更新,然后在另一个存储过程中调用execute。我可以使用一个SQL命令将其设置为在代码中执行此操作吗?

解决方案

回答

我们也可以创建sql触发器。

回答

根据库,通常可以将两个查询放在一个命令字符串中,并用分号分隔。

回答

信息不足-什么是SQL Server?为什么有历史记录表?

触发器将执行此类操作。 MySQL的binlog可能对我们更有用。

我们说我们不控制数据库。我们控制访问它的代码吗?在此处添加日志记录,并将其完全排除在SQL Server之外。

回答

可以在同一条语句中运行它们(以分号分隔单独的命令),也可以使用事务来运行它们,以便在第二条失败时回退第一条语句。

回答

我们实际上并不需要为此存储的proc。问题的实质归结为我们是否可以控制所有插入物。如果实际上我们可以访问所有插入,则只需将插入包装到数据表中,然后将插入包装到历史表中就可以。这将确保两者都完成,以使"成功"发生。但是,在事务中按顺序访问表时,我们需要确保不先锁定historytable再锁定datatable,否则可能会出现死锁情况。

但是,如果我们无法控制插入,则可以将触发器添加到某些数据库系统,从而使我们可以访问已修改,插入或者删除的数据。它可能会或者可能不会为我们提供所需的所有数据,例如谁进行了插入,更新或者删除,但它会告诉我们更改了什么。

回答

谢谢大家的答复,以下是我最后要做的工作提要。现在测试一下,如果发生故障,trans是否实际上会回滚。

sSQL = "BEGIN TRANSACTION;" & _
           " Update table set col1 = @col1, col2 = @col2" & _
           " where col3 = @col3 and " & _
           " EXECUTE addcontacthistoryentry @parm1, @parm2, @parm3, @parm4, @parm5, @parm6; " & _
           "COMMIT TRANSACTION;"