У меня есть таблица customers_accounts
, которая отслеживает основную информацию о клиенте в учетной записи.Когда файл клиента открывается, я синхронизирую информацию из внешней системы, чтобы наш пользователь получал самую последнюю информацию.
UPDATE
customers_accounts
SET
first_name = 'bob',
last_name = 'burger'
WHERE
account_number = '12345'
Когда пользователь обновляет учетную запись, я делаю тот же запрос, но я обновляю столбец с указанием последнего пользователя, который внес изменение
UPDATE
customers_accounts
SET
first_name = 'bob',
last_name = 'burger',
updated_by = 'H Jon Benjamin',
updated_on = GETDATE()
WHERE
account_number = '12345'
Вот проблема, которую япытаясь решить.Я хочу отслеживать изменения в таблице истории, но регистрировать изменения только в том случае, если они сделаны пользователем, а не из внешней системы.Поэтому я планировал создать триггер, который вставит строку, если пользовательский столбец не пустой на вставке (так как updated_by
неявно равен нулю выше в первом обновлении)
Я попробовал следующее:
ALTER trigger [dbo].[Accounts_Customers_LogUpdate]
ON [dbo].[Accounts_Customers]
AFTER UPDATE
AS
DECLARE @Now AS DATETIME = GETDATE()
DECLARE @User AS NVARCHAR(150)
SELECT @User = (SELECT [updated_by] FROM INSERTED)
IF (@User IS NOT NULL)
BEGIN
SET NOCOUNT ON
INSERT INTO [dbo].[Accounts_Customers-History]
SELECT *, @User, @Now
FROM inserted
END
Accounts_Customers-History
- точная копия таблицы с двумя дополнительными столбцами, change_made_by
и change_made_on
Однако, она не ведет себя так, как я ожидал.Он вставляет любое значение в updated_by
в change_made_by
, независимо от значения updated_by
в запросе.Поэтому я получаю зарегистрированную активность, инициированную как пользователем, так и импортом.