当特定 table(产品)中的任何字段更新时,复制元组或将元组的 ID 保存在另一个 table(产品日志)中
Copy Tuple OR save Id of Tuple in another table (ProductLogs) when any field is updated in a specific table (products)
我不知道我找到的解决方案是否可行。
问题陈述:数据库中有一个名为Products的table,我需要跟踪有价格的产品updated/modified,但我不想使用 modified_date 列,因为它不存在。
一位高级资源要求我 运行 在 SQL 服务器数据库中进行查询,每当 table 将被修改时,该记录将被复制到您的 log/track table,所以我可以从那里找到。
尝试在UPDATE
之后使用触发器:
CREATE TRIGGER ModDate
ON YourTable
AFTER UPDATE
AS
BEGIN
INSERT INTO dbo.LogTable(DateModified)
VALUES (GETDATE());
PRINT 'New Block Date Added';
END
更新:
当触发器工作时,引擎盖下有两个 tables:
- "INSERTED"
- "DELETED"
这些虚拟 table 中的数据取决于您在做什么:
- 插入操作:插入记录时,virtual table "inserted" 包含新插入的记录,其中 "DELETED" virtual table 保持为空
更新操作:更新一条记录时,首先会将旧记录放入"DELETED"虚拟table,新更新的记录由"INSERTED"虚拟table.
这意味着您可以从 "DELETED" 获取旧值,并通过 "INSERTED" 虚拟 table 获取当前更新的值。您可以像这样查询它们:
-- To get the old record value
SELECT * FROM DELETED
-- To get the updated value
SELECT * FROM INSERTED
删除操作:当尝试删除任何特定记录时,删除的记录将被插入到 "DELETED" 虚拟 table.
所以你的触发器应该是这样的:
CREATE TRIGGER ModDate
ON YourTable
AFTER UPDATE
AS
BEGIN
INSERT INTO dbo.LogTable(DateModified, IdUpdatedRow)
SELECT GETDATE(), INSERTED.YourIdOfUpdatedRow;
PRINT 'New Block Date Added';
END
正如 StepUp 所提到的,执行此操作的经典方法是使用 AFTER TRIGGER。示例解决方案将仅通过更新触发。在您的情况下,您还想为 INSERT 和 DELETE 添加触发器,或者调整一个触发器来处理这 3 种事件类型。
请注意,使用触发器会影响@@ROWCOUNT,因此可能会影响功能。
因此,我认为 SQL 服务器的最新版本具有替代机制。
我不知道我找到的解决方案是否可行。
问题陈述:数据库中有一个名为Products的table,我需要跟踪有价格的产品updated/modified,但我不想使用 modified_date 列,因为它不存在。
一位高级资源要求我 运行 在 SQL 服务器数据库中进行查询,每当 table 将被修改时,该记录将被复制到您的 log/track table,所以我可以从那里找到。
尝试在UPDATE
之后使用触发器:
CREATE TRIGGER ModDate
ON YourTable
AFTER UPDATE
AS
BEGIN
INSERT INTO dbo.LogTable(DateModified)
VALUES (GETDATE());
PRINT 'New Block Date Added';
END
更新:
当触发器工作时,引擎盖下有两个 tables:
- "INSERTED"
- "DELETED"
这些虚拟 table 中的数据取决于您在做什么:
- 插入操作:插入记录时,virtual table "inserted" 包含新插入的记录,其中 "DELETED" virtual table 保持为空
更新操作:更新一条记录时,首先会将旧记录放入"DELETED"虚拟table,新更新的记录由"INSERTED"虚拟table.
这意味着您可以从 "DELETED" 获取旧值,并通过 "INSERTED" 虚拟 table 获取当前更新的值。您可以像这样查询它们:
-- To get the old record value SELECT * FROM DELETED -- To get the updated value SELECT * FROM INSERTED
删除操作:当尝试删除任何特定记录时,删除的记录将被插入到 "DELETED" 虚拟 table.
所以你的触发器应该是这样的:
CREATE TRIGGER ModDate
ON YourTable
AFTER UPDATE
AS
BEGIN
INSERT INTO dbo.LogTable(DateModified, IdUpdatedRow)
SELECT GETDATE(), INSERTED.YourIdOfUpdatedRow;
PRINT 'New Block Date Added';
END
正如 StepUp 所提到的,执行此操作的经典方法是使用 AFTER TRIGGER。示例解决方案将仅通过更新触发。在您的情况下,您还想为 INSERT 和 DELETE 添加触发器,或者调整一个触发器来处理这 3 种事件类型。
请注意,使用触发器会影响@@ROWCOUNT,因此可能会影响功能。
因此,我认为 SQL 服务器的最新版本具有替代机制。