MS SQL 中的解决方案
MS SQL触发功能具有deleted与inserted在其中受操作的所有行存储系统表。您可以计算更新的行数:
set @updatedCount = (select count(*) from deleted)
Run Code Online (Sandbox Code Playgroud)
或找出最小值:
set @updatedMinimumCol1 = (select min(col1) from deleted)
Run Code Online (Sandbox Code Playgroud)
PostgreSQL 的问题
对于FOR EACH ROW触发器,我可以使用 OLD 和 NEW 系统记录,但它们每次调用触发器只存储 1 行。触发器的调用是分开的,所以如果用户更新 10 行,触发器将被调用 10 次,但每次我只能知道 1 个当前行,而不是所有 10 行。
因为FOR EACH STATEMENT我根本不知道任何访问更新行的机制。我使用 PostgreSQL v9.6,OLD TABLE并NEW TABLE在 v10 中引入。
PostgreSQL 不允许在语句级触发器中引用旧表和新表,即包含所有旧行和/或新行的表,这些表由 SQL 标准中的 OLD TABLE 和 NEW TABLE 子句引用。
尝试使用 transaction_timestamp() 附加列
我可以DEFAULT transaction_timestamp()向主表添加特殊列,然后使用它来区分刚刚更新的行与其他行,但这不是解决方案,因为多个INSERTs/UPDATEs …