在 SQL 服务器中更新记录之前制作记录副本的正确方法是什么?

What is the proper way of making a copy of a record before updating it in SQL Server?

我刚开始编写 SQL 程序(在本例中为 SQL 服务器),我试图在一个开始中执行两个语句,一个 INSERT 和一个 UPDATE。我想做的是将现有 phone 号码和 ID 复制到 phonelist_log table,然后更新现有记录。我不确定这是否是一种正确的方法,或者 INSERT 上的触发器是否可以做到这一点。请建议如何解决多个 DML 语句,或者我应该使用触发器来解决这个问题。提前致谢。

DECLARE @id VARCHAR(10)
DECLARE @phone VARCHAR(10)
DECLARE @newPhone VARCHAR(10)

SELECT @phone = phone from phonelist where id = @id
IF (@phone IS NULL)
    BEGIN
        INSERT INTO phonelist(id,phone) VALUES (@id, @newPhone)
    END
ELSE
    BEGIN
       INSERT INTO phonelist_log(id,phone) VALUES(@id,@phone)
       UPDATE phonelist SET phone = @newPhone where id = @id
    END

您提到的方法很好,您可以在一个 begin/end 中执行多个 DML 操作,但请确保在执行多个 DML 操作时使用 in Transaction .

触发器也是存档的选项之一,但根据我的观点,上述方法更好。

另一个不错的选择是使用 CDC - 更改数据捕获(SQL 服务器内置功能)进行更改跟踪。您可以在整个数据库或特定 table 上启用 CDC,您可以在 phone 列表 table 上启用它。这将在单独的 table 中跟踪所有 table 更改 (insert/update/delete)。有关 CDC 的更多详细信息 -

https://docs.microsoft.com/en-us/sql/relational-databases/track-changes/enable-and-disable-change-data-capture-sql-server?view=sql-server-2017