Как насчет того, чтобы включить Change Data Capture, а затем избавиться от всего этого кода?
Отредактировано, чтобы добавить остальные:
На самом деле, если вы рассматриваете возможность использования скалярной функции для получения имени пользователя, то не делайте этого. Это действительно плохо из-за проблем, связанных с процедурными скалярными функциями. Вам было бы лучше с чем-то вроде:
INSERT dbo.History (id, ...)
SELECT i.id, ...
FROM inserted i
JOIN deleted d ON d.id = i.id
JOIN dbo.users u ON u.user_id = i.user_id;
Поскольку user_id уникален, и у вас есть FK, когда он используется, это не должно быть большой проблемой. Но да, вам нужно повторять эту логику в каждом триггере. Если вы не хотите повторять логику, используйте Change Data Capture в SQL 2008.